在二叉树中查找最大元素

时间:2014-02-08 06:24:20

标签: java search recursion tree binary-tree

我对在binary tree中找到元素感到困惑。

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

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

我不会遗忘:以此为例进行重新审核 left = FindMaxNmb(root.getLeft());这将继续调用,除非它到达最左边的底部叶子,然后分配值,与getRight()相同....但这个东西仅适用于有2个孩子的最左边的节点...如何它检查剩余节点的值(我假设二叉树没有排序

我知道我错过了一些非常明显的东西......请帮助!!

1 个答案:

答案 0 :(得分:2)

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

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

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

例如,考虑这个二进制树,在这种情况下不是BST(来自维基百科):

http://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Binary_tree.svg/192px-Binary_tree.svg.png

调用堆栈,因为它在树中的工作方式,将如下所示-表示堆栈级别,数字代表节点。

-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)..