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

Data structures 检查二叉树是否为二叉搜索树的伪代码-不确定递归,data-structures,tree,binary-search-tree,pseudocode,Data Structures,Tree,Binary Search Tree,Pseudocode,我需要编写伪代码来检查有效的二叉树是否是搜索二叉树 我创建了一个数组来保存树的顺序值。如果顺序值是降序的,这意味着它确实是BST。然而,我对INOVERAR方法中的递归有一些问题 我需要更新数组的索引,以便按照值在树上的顺序将值提交给数组 我不确定在递归过程中是否真正正确地更新了索引。。是不是?如果你发现一些问题,你能帮我解决吗?非常感谢 伪码 第一功能 IsBSTnode 大小← 树形电极 创建大小为单元数的新数组树 索引← 0 几点意见: 现在我们使用一个小的变化的按序过程,我称这个过程的新

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

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

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

我不确定在递归过程中是否真正正确地更新了索引。。是不是?如果你发现一些问题,你能帮我解决吗?非常感谢

伪码

第一功能

IsBSTnode

大小← 树形电极

创建大小为单元数的新数组树

索引← 0

几点意见: 现在我们使用一个小的变化的按序过程,我称这个过程的新版本为:inorderar inorderar的伪代码描述如下IsBST

索引节点、树环、索引

对于从1号到1号的i

如果不是Trearr[i]>Trearr[i-1]返回 假的

返回真值

第二功能

顺序节点、数组、索引 如果node=NULL,则返回

否则

INORDERAR node.left,数组,索引

trearr[index]=node.key

索引← 索引+1

INORDERAR node.right,数组,索引

返回


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

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

BST通常是这样定义的:节点的左子树包含的键小于该节点的键,而右子树包含的节点具有更大的键–请参阅Wikipedia的文章。然后按顺序遍历按升序检索键。你为什么期望降序

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

编辑

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

请参阅我在答案中添加的示例代码。