当前位置: 首页 > 知识库问答 >
问题:

检查二叉树是否是二叉搜索树的伪代码-不确定递归

姜景焕
2023-03-14

我需要编写伪代码来检查有效的二叉树是否是搜索二叉树。

我创建了一个数组来保存树的顺序值。如果顺序值是降序的,这意味着它确实是BST。然而,我对INOVERAR方法中的递归有一些问题。

我需要更新数组的索引,以便按照值在树上的顺序将其提交给数组。

我不确定在递归过程中索引是否真的得到了正确更新。。到底是不是?如果你发现问题,能帮我解决吗?谢谢

伪代码

第一功能

IsBST(节点)

大小← 树化(节点)

创建新数组TreeArr of size单元格数

指数← 0

评论很少:现在我们使用的IN_ORDER程序有一个小的变化,我调用了新版本的程序:InOrderArr InOrderArr的伪代码描述如下IsBST

InOrderArr(节点、TreeArr、索引)

对于我来说,从1号到1号都可以

如果不是(特雷尔[i]

返回真值

第二个功能

InOrder(节点、数组、索引)如果node=NULL,则返回

别的

顺序(node.left、数组、索引)

索引node.key

指数← 指标1

InOrderArr(node.right,数组,索引)

回来

共有1个答案

姜德泽
2023-03-14

你的代码通常是正确的。只有三个音符。

>

  • 代码的正确性取决于实现,特别是index处理的方式。许多编程语言通过值将参数传递给子例程。这意味着子例程接收值的副本,对参数所做的修改对原始值没有影响。因此,在执行InOrderArr(node.left, Array, index)期间递增index不会影响treeArr[index]=node.key使用的位置。因此,只有最右边的路径会存储数组中。
    为了避免这种情况,您必须确保index通过引用传递,以便被调用者完成的增量会推进调用者稍后使用的位置。

    BST的定义通常是这样的:节点的左子树包含的密钥小于该节点的密钥,而右子树包含的节点具有更大的密钥——请参阅维基百科关于BST的文章。然后,索引遍历按升序检索密钥。你为什么期望降序?

    删除数组并递归测试BST的定义条件可能会更有效
    每当我们跟随链接时,我们都希望得到比当前键小的键。每当我们点击右键链接时,我们都希望键比当前键大。所以对于大多数子树,都有一些键值的间隔,由一些祖先节点的键定义。只需跟踪这些密钥,测试密钥是否在当前有效间隔内。确保在letfmost路径上处理“未定义左端”条件,在树的最右侧路径上处理“未定义右端”条件。在根节点上还没有祖先,所以根本不测试根键(任何值都可以)。

    编辑

    C代码草案:

        // Test a node against its closest left-side and right-side ancestors
        boolean isNodeBST(NODE *lt, NODE *node, NODE *rt)
        {
            if(node == NULL)
                return true;
            if(lt != NULL && node->key < lt->key)
                return false;
            if(rt != NULL && node->key > rt->key)
                return false;
    
            return
                isNodeBST(lt, node->left, node) &&
                isNodeBST(node, node->right, rt);
        }
    
        boolean isTreeBST(TREE *tree)
        {
           return isNodeBST( NULL, tree->root, NULL);
        }
    

  •  类似资料:
    • 我正试图解决这个问题,但我遇到了一些麻烦: 在二进制搜索树(BST)中: 节点左子树中每个节点的数据值小于该节点的数据值。 节点右侧子树中每个节点的数据值大于该节点的数据值。 如您所见,节点(4)位于节点(3)的左侧子树中,尽管4大于3,因此方法应该返回。但是,我的代码返回。 我怎么能控制这个案子?如何检查左/右子树中的所有值都低于/大于根(不仅是直接子树)?

    • 我写了一个函数,如果给定的二叉树是二叉搜索树,则返回true,否则返回false。 我的功能对吗?

    • 编写一个Lisp程序来检查一个二叉树是否是二叉搜索树。 我正在尝试编写一个二进制递归方法,但我是一个初学者,我不知道从这里去哪里。

    • QSTN:当它是叶节点时,为什么需要初始化ls=0或rs=0。考虑链接中给出的树,如果我们到达节点4,如果(node==NULL isLeaf(node))返回1;上面的代码将1(true)返回到调用它的函数,即节点10,类似地,右侧将true返回到节点10,因此我们现在可以进入下面的循环,因为如果(isSumTree(node->left)&&isSumTree(node->left)&&isS

    • 我有一个很严重的问题,就是在一棵树中重复搜索子树。 我试过了,但是。。。 似乎没有正确的形式。containsTree函数在找到与另一个节点不同的节点时停止搜索。 下面是两棵树的例子。 在这种情况下,当函数比较右边的子树和左边的子树时,当find等于父节点但它有不同的子节点时,它会停止搜索。我需要函数不要停止搜索,而是抛出这一点,搜索所有其他子节点及其子树。