为什么Sedgwick每次都在BST中为root分配一个新节点?

时间:2017-02-27 23:21:07

标签: java algorithm binary-search-tree

我无法理解为什么每次放置新节点时root都会获取新值?我想根变量应该是对二叉树中第一个元素的引用。

public class BST<Key extends Comparable<Key>, Value> {
        private Node root;             // root of BST

        private class Node {
            private Key key;           // sorted by key
            private Value val;         // associated data
            private Node left, right;  // left and right subtrees
            private int size;          // number of nodes in subtree

            public Node(Key key, Value val, int size) {
                this.key = key;
                this.val = val;
                this.size = size;
            }
        }

        public void put(Key key, Value val) {
            root = put(root, key, val); //?!!
        }

        private Node put(Node x, Key key, Value val) {
            if (x == null) return new Node(key, val, 1);
            int cmp = key.compareTo(x.key);
            if (cmp < 0) x.left = put(x.left, key, val);
            else if (cmp > 0) x.right = put(x.right, key, val);
            else x.val = val;
            x.size = 1 + size(x.left) + size(x.right);
            return x;
        }
}

1 个答案:

答案 0 :(得分:0)

root实际上每次都没有获取新值。递归辅助函数put()沿树向下,直到它到达死胡同,在这种情况下,它创建一个新节点并将其返回到最后一个被访问节点,

    if (x == null) return new Node(key, val, 1);

将其指定为leftright

    if (cmp < 0) x.left = put(x.left, key, val);
    else if (cmp > 0) x.right = put(x.right, key, val);

然后,该节点再次作为它的父节点的leftright返回,依此类推,直到树的最后一个,直到最后的旧/现有根为返回:

    root = put(root, key, val);

如果树完全为空(如果rootnull),则辅助函数会立即创建一个新节点并返回该节点。

一个关键观察:

无论传递给辅助函数put是什么,因为第一个参数不变,除了,如果它是null,在这种情况下创建并返回一个新节点