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 ", 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 ", 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 }
运行结果: