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