【问题标题】:Find maximum element in binary tree在二叉树中找到最大元素
【发布时间】:2014-03-05 18:02:20
【问题描述】:

我真的很困惑在binary tree 中找到一个元素。

问题:当我们说,在二叉树中搜索一个元素时,在这种情况下是最大值,我们是否假设树是排序的???
如果没有,请看下面的代码,我从一本书中得到它,几乎每个在线 url 都在暗示类似的模式

int FindMaxNmb(BinaryTreeNode root)
    {
        int root_val,left,right,max;
        if(root!=null)
        {
            root_val = root.getData();

            //recursion - this is what i dont understand

            /*
             *
             * This code would have made sense if binary tree contained
             * sorted elements,like  The left subtree of a node contained 
             * only nodes with keys less than the node's key The right subtree 
             * of a node contained only nodes with keys greater 
             * than the node's key.
             *   
             * */
            left = FindMaxNmb(root.getLeft());
            right = FindMaxNmb(root.getRight());

            //Find max nmbr
            if(left > right)
            {
                max = left;
            }
            else
            {
                max = right;
            }

            if(root_val > max)
            {
                max = root_val;
            }
        }
        return max;
    }

我不明白的: 以这个 recursion 为例 left = FindMaxNmb(root.getLeft()); 这将继续调用,除非它到达最左边的底部叶子然后分配值,getRight() 也是如此......但是这个东西只适用于有 2 个孩子的最左边的节点......它如何检查剩余节点的值(我假设二叉树没有排序

我知道我在这里遗漏了一些非常明显的东西......请帮忙!

【问题讨论】:

  • ok..让我说得简单点...在我发布的代码中,它在 BST 而不是 BT 的假设下搜索最大元素...对吗??

标签: java search recursion tree binary-tree


【解决方案1】:

Binary TreeBinary Search Tree 之间的区别在于,BST 在每个节点及其左/右子节点之间都有一个保证 - 一个普通的 BT没有排序

提供的代码适用于普通二叉树,因为它depth first 方式遍历所有节点。 (如果数据 BST,算法只需要找到“最右边的”节点并返回它的值来找到树中的最大值。)

现在,在所示的 BT 实现中,每个递归函数找到由左子节点或右子节点(子节点是子树的根)给出的子树的最大值,这个值就是返回。

例如,考虑这个二叉树,在这种情况下它不是 BST(来自 Wikipedia):

调用堆栈在整个树中工作,如下所示,其中- 代表堆栈级别,数字代表节点。

-2
--7 (l)
---2 (l)
---6 (r)
----5 (l)
----11 (r)
--5 (r)
---9 (r)
----4 (l)

堆栈只有在到达终端情况时才能“展开” - 这左右子树的最大值已经计算(通过递归到FindMaxNmb)。

在展开阶段..

  • .. 到达节点 11 时没有正确的节点,所以返回到 6
  • 因为这完成了在右子树(6 个)中的搜索,它返回到 7
  • 因为这完成了在右子树(7 个)中的搜索,它返回到 2
  • 由于这完成了在左子树(2)中的搜索,因此进入了右子树(5)..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多