问题分析:
本程序要求实现判定一棵二叉树是否为二叉排序树。为实现上述功能,需要解决的关键问题是:建立一棵二叉树及判定二叉树过程。
概要设计:
建立一个以二叉链表方式存储的二叉树,输入结点信息时按照完全二叉树的结点顺序输入。由于一棵二叉排序树中序遍历后的序列是递增有序的,因此可利用中序遍历一棵二叉树后的序列是否递增有序来判断是否为二叉排序树。
详细设计:
建立二叉树时,按照完全二叉树的结点顺序输入,“1”表示虚结点,“0”表示输入结束。
若不是虚结点时,则建立一个新结点,并且将其作为左孩子或右孩子结点连接到它的父结点上(第一个结点无父结点);若是虚结点,则将空结点(NULL)作为左孩子或右孩子结点连接到它的父节点上。
判定二叉树时,中序遍历整棵二叉树,访问根结点时将根结点信息存入一个数组中,以用来比较中序遍历后序列是否为空。比较数组元素时,从下标为0的数组元素开始比较,先将下标为i=0的a[i]与下标为1的a[i+1]比较,如果a[i]>a[i+1],则结束比较,即该二叉树不是二叉排序树,否则继续比较,直至比较完整个数组元素。
代码如下:
1 #include "stdafx.h" 2 #include<stdlib.h> 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include"string" 6 #include"malloc.h" 7 #define max 100 8 typedef struct node { 9 int data; 10 node *lchild, *rchild; 11 }Bitree; 12 Bitree *B[max]; 13 int temp = 0; 14 int Btree[max]; 15 16 void Inorder(Bitree *T) { //中序遍历二叉树,并将每个结点数据存入数组中 17 if (T != NULL) { 18 Inorder(T->lchild); 19 printf("%d\t", T->data); 20 Btree[temp] = T->data; 21 temp++; 22 Inorder(T->rchild); 23 } 24 } 25 int Judgesort_bitree(int Btree[]) { //判断是否是二叉排序树 26 int i, sign = 1; 27 for (i = 0; i<temp - 1; i++) { 28 if (Btree[i]>Btree[i + 1]) { 29 sign = 0; 30 break; 31 } 32 } 33 return sign; 34 } 35 void Judgeout(int a) { //判断输出 36 if (a == 1) 37 printf("给定二叉树是二叉排序树!\n"); 38 if (a == 0) 39 printf("给定二叉树不是二叉排序树!\n"); 40 } 41 42 Bitree *Creatree() { //建立二叉树 43 Bitree *T, *S; 44 int ch; 45 int front, rear, sign; 46 sign = 0; 47 front = 0; 48 rear = -1; 49 T = NULL; 50 printf("建立二叉树(1表示虚结点,0表示输入结束):\n"); 51 scanf_s("%d", &ch); 52 while (ch != 0) { 53 if (ch != 1) { //输入结点不是虚结点 54 S = (Bitree *)malloc(sizeof(Bitree)); 55 S->data = ch; 56 S->lchild = S->rchild = NULL; 57 rear++; 58 B[rear] = S; 59 if (rear == front) { 60 T = S; 61 sign++; 62 } 63 else { 64 if (sign % 2 == 1) //寻找父结点 65 B[front]->lchild = S; 66 if (sign % 2 == 0) { 67 B[front]->rchild = S; 68 front++; 69 } 70 sign++; 71 } 72 //printf("\n"); 73 //Judgeout(Judgesort_bitree(Btree)); 74 } 75 else { //输入结点为虚结点 76 if (sign % 2 == 0) 77 front++; 78 sign++; 79 } 80 scanf_s("%d", &ch); 81 } 82 return T; 83 } 84 void main() { 85 Bitree *T; 86 T = Creatree(); 87 printf("中序遍历:\n"); 88 Inorder(T); 89 printf("\n"); 90 Judgeout(Judgesort_bitree(Btree)); 91 system("pause");//便于观察 92 }