二叉排序树-插入算法

 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 BFS(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     // BFS(root,len);//层次遍历方式
82     inorder(root);//中序遍历方式,正好配合二叉排序树,将其顺序打印出来
83     return 0;
84 }

运行结果:

 

posted @ 2019-11-13 16:33  细雨轻风  阅读(2539)  评论(0编辑  收藏  举报