算法导论-二叉搜索树-练习

这篇博客探讨了二叉搜索树的性质,通过分析给出的查找序列判断哪些不符合二叉搜索树的规则,同时提出了TREE-MINIMUM、TREE-MAXIMUM及TREE-PREDECESSOR的递归版本和相关证明,强调了结点后继和前驱的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

12.2-1 假设一棵二叉搜索树中的结点在 1 到 1000 之间,现在想要查找数值为 363 的结点。下面序列中哪个不是查找过的序列?

a. 2, 252, 401, 398,330,344,397,363。

b. 924,220,911,244,898,258,362,363。

c. 925,202,911,240,912,245,363。

d. 2,399,387,219,266,382,381,278,363。

e. 935,278,347,621,299,392,358,363。

ANSWER:

根据二叉树的性质,左子树的所有结点都要小于根节点,右子树上的所有结点都要大于根节点。

a中,2后面是252,说明252在2的右子树,其后所有结点均大于2,252后面是401,说明401在252右结点,其后所有值均大于252,以此类推即可。

c:240 < 911,即 240 是 911 的左子树,则 240 后的数需小于 911,而 912 > 911,矛盾。

e:621 > 347,即 621 是 347 的右子树,则 621 后的数需大于 347,而 299 < 347,矛盾。

 

12.2-2 写出 TREE-MINIMUM 和 TREE-MAXIMUM 的递归版本。

TREE_MINIMUM(root){

    if (root->left == NULL)

        return root;

    else

        return TREE_MINIMUM(root->left);

}
TREE_MAXIMUM(root){

    if (root->right == NULL)

        return root;

    else

        return TREE_MAXIMUM(root->right);
}

12.2-3 写出过程 TREE-PREDECESSOR 的伪代码。

TREE-PREDECESSOR(x)

    if x.left ≠ NIL

        return TREE-MAXIMUM(x.left)

    y = x.p

    while y ≠ NIL and x == y.left:

        x = y

        y = x.p

    reutrn y

12.2-5 证明:如果一棵二叉搜索树中的一个结点有两个孩子,那么它的后继没有左孩子,它的前驱没有右孩子。

ANSWER:根据 TREE-SUCCESSOR ( TREE-PREDECESSOR ),如果结点 x 有右(左)儿子,则返回右(左)儿子的 TREE-MINIMUM ( TREE-MAXIMUM ),所以后继(前驱)没有左(右)儿子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值