二叉排序树的判断(二叉树的顺序存储):2022年408算法题
2023-12-13 20:17:42
- 对于采用顺序存储方式保存的二叉树,根结点保存在SqBiTNode[0]中;当某结点保存SqBiTNode[i]中时,若有左孩子,则其值保存在SqBiTNode [2i+1]中;若有右孩子,则其值保存在SqBiTNode[2i+2]中;若有双亲结点,则其值保存在SqBiTNode [(i-1)/2]中
- 二叉搜索树需要满足的条件是:任一结点值大于其左子树中的全部结点值,小于其右子树中的全部结点值。中序遍历二叉搜索树得到一个升序序列
算法思想
- 对二叉树进行中序遍历,在遍历过程中,判断当前访问结点是否大于等于上一个访问的结点,若遍历的每个结点均满足条件,则遍历结束后返回true,否则返回false
算法实现
int preIndex = 0;//全局变量:用于记录上一个访问的结点下标(前驱),初始化为0,因为结点值均为正整数
bool isBST(SqBiTree *T,int index){
if(T->SqBiNode[index] == -1) return true; //空结点也满足二叉排序树定义,返回true
if(!isBST(T,index*2+1)) return false;//递归判断左子树,若左子树返回false,则向上返回false
if(T->SqBiNode[index] <= T->SqBiNode[preIndex]) return false;//当前结点小于上一个访问的结点
else preIndex = index; //已访问该结点,记录为上一个结点
if(!isBST(T,index*2+2)) return false;//递归判断右子树,若右子树返回false,则向上返回false
return true; //该树是二叉排序树,返回true
}
补充:链式存储的二叉树判断是否为二叉排序树
- 二叉排序的中序遍历时递增有序的序列
- 设置全局变量temp记录已访问过结点的最大值
- 设置全局变量flag记录是否满足后访问的结点始终大于先前访问的结点
- 若遍历结束后,flag的值未发生变化,为true,则是二叉排序树
int temp=MIN_INT;//记录当前遍历到的最小值
bool isBST=true;//是否为二叉排序树?
void InOrder(BiTree T){
if(T =NULL)return;
InOrder(T->Ichild);
if (T->data >temp){
temp=T->data;
else
isBST=false;
InOrder(T->rchild);
}
//另解:不设置最小值,直接比较前后遍历的结点值
TreeNode* pre = NULL; // 用来记录前一个节点
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
bool left = isValidBST(root->left);
if (pre != NULL && pre->val >= root->val) return false;
pre = root; // 记录前一个节点
bool right = isValidBST(root->right);
return left && right;
}
文章来源:https://blog.csdn.net/Listennnn/article/details/134911577
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!