我有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)
返回
答案 0 :(得分:0)
您的代码通常是正确的。只有三个音符。
代码的正确性取决于实现,特别是index
处理的方式。许多编程语言都通过值将参数传递给子例程。这意味着子例程接收值的副本,并且对参数所做的修改对原始值没有影响。因此,在执行index
期间递增InOrderArr (node.left, Array, index)
不会影响treeArr[index] = node.key
使用的位置。因此,只有最右边的路径才会存储在数组中
为避免这种情况,您必须确保index
通过引用传递,以便被调用者完成的增量提高调用者稍后使用的位置。
通常定义BST,以便节点的左子树包含小于该节点键的键,右子树包含具有更大键的节点 - 请参阅Wikipedia的文章BST。然后inorder遍历以升序检索键。你为什么期望降序?
放弃数组并递归测试BST的定义条件可能会更有效率吗?
每当我们关注left
链接时,我们都希望密钥小于当前密钥。每当我们按照right
链接时,我们都希望密钥大于当前密钥。因此,对于大多数子树,存在一些键值间隔,由一些祖先节点定义'键。只需跟踪这些键并测试密钥是否落在当前有效间隔内。一定要处理“没有左端定义'在最远的路径上的条件和没有右端的'在树的最右边的路径上。在根节点上还没有祖先,所以根本没有测试根密钥(任何值都可以)。
修改强>
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);
}