二叉排序树(BST)的建立

给一个非递归的吧。

 1 /*
 2 已知,二叉树存储结构定义见bstree.h,请编写一个算法函数bstree creatBstree(int a[],int n),
 3 以数组a中的数据作为输入建立一棵二叉排序树,并将建立的二叉排序树进行中序遍历。
 4 (提示,a中的原始数据可从data1.txt中读入,实验代码详见lab9_05.c)
 6 */
 7
 8 #include "Arrayio.h"
 9 #include "bstree.h"
10 #define N 100
11 bstree  creatBstree(int a[],int n)
12   { /*根据输入的结点序列,建立一棵二叉排序树,并返回根结点的地址*/
13     int i, flag;
14     bstree root, p, q;
15     root = (bstree)malloc(sizeof(bsnode));
16     root->key = a[0];
17     root->lchild = NULL;
18     root->rchild = NULL;
19     for (i = 1; i < n; i++)
20     {
21         p = root;
22         while (true)
23         {
24             if (a[i]<p->key)
25             {
26                 if (p->lchild != NULL) { p = p->lchild; flag = 0; }
27                 else {flag=0;break;}
28             }
29             else if (a[i]>p->key)
30             {
31                 if (p->rchild != NULL) { p = p->rchild; flag = 1; }
32                 else {flag=1;break;}
33             }
34             else
35             {
36                 flag = -1; break;
37             }
38         }
39         q = (bstree)malloc(sizeof(bsnode));
40         q->key = a[i];
41         q->lchild = NULL;
42         q->rchild = NULL;
43         if (flag==1)
44             p->rchild = q;
45         else if (flag==0)
46             p->lchild = q;
47     }
48     return root;
49 }
50
51 int  main()
52   {
53     int n,a[N];
54     bstree p,t;
55     n=readData(a,N,"data1.txt");
56     output(a,n);
57     t=creatBstree(a,n);         /*创建二叉排序树*/
58     printf("中序遍历:\n");
59     inorder(t);                 /*中序遍历二叉排序树*/
60
61     return 0;
62  }
 1 /**************************************/
 2 /*         二叉排序树用的头文件       */
 3 /*          文件名:bstree.h          */
 4 /**************************************/
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 typedef struct node1            /*二叉排序树结点定义*/
 8  {
 9   int key;                      /*结点值*/
10   struct node1 *lchild,*rchild; /*左、右孩子指针*/
11   }bsnode;
12 typedef bsnode *bstree;
13
14 /*---中序遍历二叉排序树----*/
15 void inorder(bstree t)
16   { if (t) {    inorder(t->lchild);
17                 printf("%8d",t->key);
18                 inorder(t->rchild);
19              }
20
21    }
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 #define MAX 500000
 5
 6 /*从文件中读入数据存入数组a*/
 7 int readData(int a[], int n,char *f )  /*函数返回成功读入的数据个数*/
 8 {
 9     FILE *fp;
10     int i;
11     fp=fopen(f,"r");
12     if (fp==NULL)   return 0;
13     else
14     {
15         for (i=0;i<n && !feof(fp);i++)
16             fscanf(fp,"%d",&a[i]);
17         fclose(fp);
18         return i;
19     }
20 }
21
22 /*存盘函数*/
23 void saveData(int a[],int n, char *f )
24 {
25     FILE *fp;
26     int i;
27     fp=fopen(f,"w");
28     if (fp==NULL)   printf("文件建立失败!");
29     else
30     {
31         for (i=0;i<n;i++)
32             {   if (i%10==0) fprintf(fp,"%c",‘\n‘);
33                 fprintf(fp,"%8d",a[i]);
34             }
35         fclose(fp);
36     }
37 }
38
39
40 /*输出长度为n的整型数组*/
41 void output(int a[],int n)
42 {  int i;
43    printf("\n数组的内容是:\n");
44    for (i=0;i<n;i++)
45      { if (i%10==0) printf("\n");
46        printf("%7d",a[i]);
47      }
48   printf("\n");
49 }
时间: 2024-10-24 04:25:58

二叉排序树(BST)的建立的相关文章

二叉排序树(BST)

二叉排序树: 二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 它或者是一棵空树:或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: 注:中序遍历一棵二叉排序树会得到一个有序序列. 考虑序列5,3,7,2,4,8,对应的二叉排序树构造过程如下: 实现: /*************

STL源码笔记(17)—二叉排序树BST(C++封装)

二叉排序树BST STL中还有一类非常重要的容器,就是关联容器,比如map啊set啊等等,这些容器说实话,在应用层上还不能完全得心应手(比如几种容器效率的考虑等等),更别说源码了,因此这一部分打算稳扎稳打,好好做做笔记研究一番. 说到关联容器,我们想到了什么AVL树,红黑树等等,但大多时候我们仅仅局限于知道其名字,或者知道其概念,俗话说"talk is cheap,show me the code",因此,我打算从他们的祖爷爷二叉排序树开始下手.(其实,侯老师的书上也是这么安排的哈)

查找算法系列之复杂算法:二叉排序树BST

前面总结了顺序查找,二分查找,分块查找算法,此篇博文将详解介绍二叉排序算法(Binary Sort Tree). 在介绍二叉排序算法之前,首先介绍什么事二叉排序树(BST). 首先从二叉树讲起: 1.二叉树的概念 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(leftsubtree)和"右子树"(rightsubtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有

【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较

二分法查找: 『在有序数组的基础上通过折半方法不断缩小查找范围,直至命中或者查询失败.』 二分法的存储要求:要求顺序存储,以便于根据下标随机访问 二分法的时间效率:O(Log(n)) 二分法的空间效率:原地查询 O(1) 二分法对应的搜索树是确定的. 二叉排序树查找: 『借助二叉排序树进行搜索,但因为所建立的树本身不一定是轴对称的,所以每次比较并不能确保减小一半范围.』 二叉树的存储要求:需要树形结构,相比顺序存储需要占用更多的空间,但也有链接型数据结构灵活可拓展的有点. 二叉排序树查找的时间复

哈夫曼树;二叉树;二叉排序树(BST)

优先队列:priority_queue<Type, Container, Functional>Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式.Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大. 而在求哈夫曼树中,我们恰恰需要取得堆中最小的元素,

二叉排序树(BST)的思路及C语言实现

请注意,为了能够更好的理解二叉排序树,我建议各位在看代码时能够设置好断点一步一步跟踪函数的运行过程以及各个变量的变化情况 一.动态查找所面临的问题 在进行动态查找操作时,如果我们是在一个无序的线性表中进行查找,在插入时可以将其插入表尾,表长加1即可:删除时,可以将待删除元素与表尾元素做个交换,表长减1即可.反正是无序的,当然是怎么高效怎么操作.但如果是有序的呢?回想学习线性表顺序存储时介绍的顺序表的缺点,就在于插入删除操作的复杂与低效. 正因为如此,我们引入了链式存储结构,似乎这样就能解决上面遇

判断二叉树是否二叉排序树(BST)

算法思想:由于二叉排序树的中序遍历可以得到一个有序的序列,因此,我们可以使用中序遍历进行求解. 代码如下: 1 #include <stack> 2 using namespace std; 3 4 typedef struct BinaryTree 5 { 6 int data; 7 BinaryTree *lc; 8 BinaryTree *rc; 9 }BTNode,*BinaryTree; 10 11 bool isBST(BinaryTree T) 12 { 13 int preva

关于二叉排序树 BST

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct node 5 { 6 double w; 7 struct node *l,*r; 8 }*Node; 9 10 void Build(Node &rt,double a)//建树 11 { 12 if(rt==NULL) 13 { 14 rt=new node; 15 rt->w=a; 16 rt->l=0; 17 rt->r=0; 1

4.5---判断是否是二叉排序树BST(CC150)

public boolean checkBST(TreeNode root) { return isBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean isBST(TreeNode root, long minVal, long maxVal) { if(null == root) { return true; } return (minVal < root.val && root.val < maxVal)

[数据结构]二叉搜索树(BST) VS 平衡二叉排序树(AVL) VS B树(平衡多路搜索树) VS B+树 VS 红黑树(平衡二叉B树)

1 二叉排序树/二叉查找树/Binary Sort Tree 1种对排序和查找都很有用的特殊二叉树 叉排序树的弊端的解决方案:平衡二叉树 二叉排序树必须满足的3条性质(或是具有如下特征的二叉树) 若它的左子树不为空,则:左子树上所有结点的值< 它根结点的值 若它的右子树不为空,则:右子树上所有结点的值 > 它根结点的值 它的左子树.右子树也分别为二叉排序树(递归性) (按照如上定义,即: 1 无键值相等的结点 2 中序遍历一颗二叉树时,可得一个结点值递增的有序序列) 2 平衡二叉排序树/Bal