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

时间:2014-03-29 16:31:10

标签: data-structures tree binary-search-tree pseudocode

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

我创建了一个数组来保存树的有序值。如果有序值按递减顺序,则表示它确实是BST。但是我在方法InOverArr中的递归方面遇到了一些问题。

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

我不确定在递归过程中索引是否真的正确更新..是不是?如果你看到一些问题,你可以帮我解决这个问题吗?非常感谢

伪代码

第一个功能

  

IsBST(节点)

     

尺寸←TreeSize(节点)

     

创建大小为单元格数的新数组TreeArr

     

指数←0

     

几条评论:   现在我们使用IN_ORDER过程的一个小变化,我调用了新版本的过程:InOrderArr   InOrderArr的伪代码在IsBST下面描述

     

InOrderArr(node,TreeArr,index)

     

for i从1到size-1

     

如果没有(TreeArr [i]> TreeArr [i-1])返回   假

     

返回true

第二个功能

  

InOrderArr(node,Array,index)   如果node = NULL则返回

     

其他

     

InOrderArr(node.left,Array,index)

     

treeArr [index] = node.key

     

指数←指数+ 1

     

InOrderArr(node.right,Array,index)

     

返回

1 个答案:

答案 0 :(得分:0)

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

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

  2. 通常定义BST,以便节点的左子树包含小于该节点键的键,右子树包含具有更大键的节点 - 请参阅Wikipedia的文章BST。然后inorder遍历以升序检索键。你为什么期望降序?

  3. 放弃数组并递归测试BST的定义条件可能会更有效率吗?
    每当我们关注left链接时,我们都希望密钥小于当前密钥。每当我们按照right链接时,我们都希望密钥大于当前密钥。因此,对于大多数子树,存在一些键值间隔,由一些祖先节点定义'键。只需跟踪这些键并测试密钥是否落在当前有效间隔内。一定要处理“没有左端定义'在最远的路径上的条件和没有右端的'在树的最右边的路径上。在根节点上还没有祖先,所以根本没有测试根密钥(任何值都可以)。

  4. 修改

    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);
    }