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 }
運行結果: