判断一棵二叉树是否为二叉搜索树(二叉排序树)的三种方法


判断一棵二叉树是否为二叉搜索树(二叉排序树)的三种方法

二叉搜索树性质:
    1.左子树的节点值<根节点值;
    2.右子树的节点值>根节点值;
    3.二叉搜索树的中序遍历序列为单调递增序列
根据以上性质可以总结出以下方法:

    方法一:如果左子树节点的最大值<根节点的值,右子树节点的最小值大于根节点,则一定为二叉搜索树
    方法二:中序遍历二叉树,若遍历结果序列单调递增,一定为二叉搜索树
        

方法一具体代码如下:

二叉树定义:

struct BiNode
{int dada;BiNode *lchild;BiNode *rchild;
};

递归找最大值:

int Find_max(BiNode *root)///找最大值
{int maxm=root->data;if(root->lchild!=NULL){int maxleft=Find_max(root->lchild);maxm=max(maxm,maxleft);}if(root->rchild!=NULL){int maxright=Find_max(root->rchild);maxm=max(maxm,maxright);}return maxm;
}

递归找最小值:

int Find_min(BiNode *root)///找最小值
{int minn=root->data;if(root->lchild!=NULL){int minleft=Find_min(root->lchild);minn=min(minn,minleft);}if(root->rchild!=NULL){int minright=Find_min(root->rchild);minn=min(minn,minnright);}return minn;
}

判断函数:

int ISBST(BiNode *root)
{if(root==NULL)return 1;if(root->lchild!=NULL && Find_max(root->lchild) > root->data)///如果左子树最大值大于根节点,直接returnreturn 0;if(root->rchild!=NULL && Find_min(root->rchild) < root->data)///如果右子树的最小值小于根节点,直接returnreturn 0;if(ISBST(root->lchild) && ISBST(root->rchild))///左子树和右子树都符合二叉搜索树的性质的二叉树才是二叉搜素树return 1;}

方法二:

将二叉树的中序遍历结果保存在数组中,判断数组中的元素是否单调递增即可

void inorder(BiNode *root)
{if(root==NULL)return;if(root->lchild!=NULL)inorder(root->lchild);temp[k++]=root->data;if(root->rchild!=NULL)inorder(root->rchild);
}
void ISBST()
{int flag=0;for(int i=1; i

方法三:方法二的改进:开辟数组占空间复杂度,所以设置一个前驱节点,每次只需与前驱节点比较即可

int ISBST(BiNode *root)
{BiNode *pre;if(root!=NULL){if(!ISBST(root->lchild))return 0;if(pre!=NULL && root->data data)return 0;pre=root;if(!ISBST(root->rchild))return 0;}return 1;
}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部