您的位置:首页 > 编程语言 > C语言/C++

【二叉树】二叉树排序树的判断、插入

2016-08-07 16:09 211 查看
二叉排序树,也称二叉搜索树,是指对于二叉树的所有结点,其左子树全部结点值小于该结点的值,右子树全部结点的值大于该结点的值。因此当我们中序遍历一棵二叉排序树时,得到的序列是一个递增序列。

注意:二叉排序树中没有相等的两个元素。

1.二叉排序树的插入

将一个元素(保证与树中元素不等)插入一棵二叉排序树时,根据二叉排序树的特征,将其与根结点比较,小于根结点插入左子树,并继续与根结点的左孩子比较直到到达叶子结点,插入。如果大于根结点则在右子树中做相同的处理。

void CreateBiSortTree(BiTreeNode* &T,int x)//将x插入二叉排序树
{
if(T==NULL)//树为空,则建立根节点
{
BiTreeNode *p=new BiTreeNode;
p->value=x;
p->lchild=NULL;
p->rchild=NULL;
T=p;
}
else
{
if(x<T->value)	CreateBiSortTree(T->lchild,x);//x小于T,放左边
if(x>T->value)	CreateBiSortTree(T->rchild,x);//x大于T,放右边
}
}
2.二叉排序树的遍历

遍历方式与二叉树一样http://blog.csdn.net/yebanxin/article/details/52139030

3.二叉排序树的判断

对普通的二叉树,如果保证对每个结点,其左孩子小于根结点,右孩子大于根结点,那么可以确定它是二叉排序树吗? 

不行,这样不能保证左子树所有结点值均小于根结点,例如左孩子的右孩子大于根结点,上面的方法无法检测出来。

因此依据二叉排序树的特点,即中序遍历序列是单调递增的,那么可以对二叉排序树进行中序遍历,记下遍历的前一个值pre,与当前值进行比较,只要有不符合单调递增要求的,则不是二叉排序树。

bool checkBST(BiTreeNode* T)
{
int pre=INT_MIN;//保存中序遍历的前一个值
return checkInorder(T,pre);
}
bool checkInorder(BiTreeNode* T,int &pre)
{
if(!T)
return 1;
if(checkInorder(T->lchild,pre)==0)
return 0;
if(pre==INT_MIN)
pre=T->value;
else if(pre>T->value)//前一个值与当前值比较
return 0;
else
pre=T->value;
if(checkInorder(T->rchild,pre)==0)
return 0;
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 遍历 C++ 搜索