二叉排序树-插入算法

雨燕双飞 提交于 2019-12-04 08:44:30
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef struct BTNode{
 5     int key;
 6     BTNode *lchild;
 7     BTNode *rchild;
 8 }BTNode;
 9 
10 int BSTInsert(BTNode *&p,int key)//用返回值判断插入是否成功
11 {
12     if(p==NULL)
13     {
14         p=(BTNode*)malloc(sizeof(BTNode));
15         p->key=key;
16         p->lchild=p->rchild=NULL;
17         return 1;//成功插入
18     }
19     else
20     {
21         if(p->key==key) return 0;//已经存在相同值的结点,插入失败
22         else
23         {
24             if(key < p->key)
25             {
26                 return BSTInsert(p->lchild,key);//去左子树
27             }
28             if(key > p->key)
29             {
30                 return BSTInsert(p->rchild,key);//去右子树
31             }
32         }
33     }
34 }
35 int DFS(BTNode*p,int maxSize)
36 {
37     int front,rear;
38     BTNode *que[maxSize];//采用循环队列,会损失一个存储位置,但是下面会不停入队出队,一般没有问题
39     front=rear=0;
40     BTNode *q;
41     if(p)//一般默认p是存在的,这里以防万一
42     {
43         rear=(rear+1)%maxSize;
44         que[rear]=p;//根结点入队
45         while(front!=rear)//循环队列队不空的条件(队满条件是(rear+1)%maxSize==front)(或者(front-1+maxSize)%maxSize==rear)
46         {
47             front=(front+1)%maxSize;
48             q=que[front];//从“前面”出队
49             printf("%d\t", q->key);
50             if(q->lchild)
51             {
52                 rear=(rear+1)%maxSize;
53                 que[rear]=q->lchild;//左孩子非空,入队
54             }
55             if(q->rchild)
56             {
57                 rear=(rear+1)%maxSize;
58                 que[rear]=q->rchild;//右孩子非空,入队                
59             }
60         }
61     }
62 }
63 void inorder(BTNode*p)
64 {
65     if(p)
66     {
67         inorder(p->lchild);
68         printf("%d\t", p->key);
69         inorder(p->rchild);
70     }
71 }
72 int main(int argc, char const *argv[])
73 {
74     int a[]={9,7,8,6,5,3,4,2,1,1,1};//有重复节点
75     int len=sizeof(a)/sizeof(int);
76     BTNode *root=NULL;
77     for(int i=0;i<len;i++)//不断地插入结点建成一棵二叉排序树
78     {
79         BSTInsert(root,a[i]);
80     }
81     // DFS(root,len);//层次遍历方式
82     inorder(root);//中序遍历方式,正好配合二叉排序树,将其顺序打印出来
83     return 0;
84 }

运行结果:

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!