Data structures 检查二叉树是否为二叉搜索树的伪代码-不确定递归
我需要编写伪代码来检查有效的二叉树是否是搜索二叉树 我创建了一个数组来保存树的顺序值。如果顺序值是降序的,这意味着它确实是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,数组,索引 返回Data structures 检查二叉树是否为二叉搜索树的伪代码-不确定递归,data-structures,tree,binary-search-tree,pseudocode,Data Structures,Tree,Binary Search Tree,Pseudocode,我需要编写伪代码来检查有效的二叉树是否是搜索二叉树 我创建了一个数组来保存树的顺序值。如果顺序值是降序的,这意味着它确实是BST。然而,我对INOVERAR方法中的递归有一些问题 我需要更新数组的索引,以便按照值在树上的顺序将值提交给数组 我不确定在递归过程中是否真正正确地更新了索引。。是不是?如果你发现一些问题,你能帮我解决吗?非常感谢 伪码 第一功能 IsBSTnode 大小← 树形电极 创建大小为单元数的新数组树 索引← 0 几点意见: 现在我们使用一个小的变化的按序过程,我称这个过程的新
您的代码通常是正确的。只有三个音符 代码的正确性取决于实现,特别是索引处理的方式。许多编程语言通过值将参数传递给子例程。这意味着子例程接收值的副本,对参数所做的修改对原始值没有影响。因此,在执行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);
}
请参阅我在答案中添加的示例代码。