判断树是否是二叉排序树

基本数据结构

#include<stdio.h>
#include<stdlib.h>

typedef struct Node{
	int data;
	struct Node *lchild,*rchild;
}Node,*PNode;

一、创建二叉排序树:

指针s 和 p 的先后关系要注意,p 最后会为 NULL。

//创建二叉排序树 
PNode CreateBiTree(int a[],int n){
	int i,j,k,flag;
	PNode p,q,s,t;
	if(n<=0)
		return NULL;
	t=(PNode)malloc(sizeof(Node));
	t->data=a[0];
	t->lchild=NULL;
	t->rchild=NULL;
	printf("%d 进树\n",a[0]);
	for(i=1;i<n;i++)
	{
		flag = 0;
		p = t;
		while(p)
		{
			s = p;	//保存要加子节点的节点,因为 p 之后会为 NULL 
			if(a[i] > p->data)
			{
				p = p->rchild;
				flag = 2;
			}
			else
			{
				p = p->lchild;
				flag = 1;
			}
		}
		q=(PNode)malloc(sizeof(Node));
		q->data=a[i];
		q->lchild=NULL;
		q->rchild=NULL;	
		printf("%d 进树\n",a[i]);
		if(flag == 1)
			s->lchild = q; 
		else
			s->rchild = q;
	}
	return t;
}

二、判断树是否是二叉排序树:

有4种情况:
1、空树。
2、左孩子存在,右孩子不存在。
3、右孩子存在,左孩子不存在。
4、左右孩子都存在。

bool JudgeBiTree(PNode t)
{
	if(!t)
		return true;
	//左孩子存在,右孩子不存在,判断左孩子和父节点大小是否正常 
	if(t->lchild && t->rchild==NULL	&& t->data < t->lchild->data)	 
		return false;
	//右孩子存在,左孩子不存在,判断右孩子和父节点大小是否正常
	if(t->rchild && t->lchild==NULL	&& t->data > t->rchild->data) 	 
		return false;
	//左孩子存在,右孩子存在,判断左、右孩子和父节点大小是否正常 
	if(t->rchild && t->lchild && (t->data < t->lchild->data || t->data > t->rchild->data))	 
		return false;
	return JudgeBiTree(t->lchild) && JudgeBiTree(t->rchild);	//递归遍历子树是否正常 
}