• 919. Complete Binary Tree Inserter


    complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible.

    Write a data structure CBTInserter that is initialized with a complete binary tree and supports the following operations:

    • CBTInserter(TreeNode root) initializes the data structure on a given tree with head node root;
    • CBTInserter.insert(int v) will insert a TreeNode into the tree with value node.val = v so that the tree remains complete, and returns the value of the parent of the inserted TreeNode;
    • CBTInserter.get_root() will return the head node of the tree.

    Example 1:

    Input: inputs = ["CBTInserter","insert","get_root"], inputs = [[[1]],[2],[]]
    Output: [null,1,[1,2]]
    

    Example 2:

    Input: inputs = ["CBTInserter","insert","insert","get_root"], inputs = [[[1,2,3,4,5,6]],[7],[8],[]]
    Output: [null,3,4,[1,2,3,4,5,6,7,8]]

    Note:

    1. The initial given tree is complete and contains between 1 and 1000 nodes.
    2. CBTInserter.insert is called at most 10000 times per test case.
    3. Every value of a given or inserted node is between 0 and 5000.

    M1: 

    ref: https://leetcode.com/problems/complete-binary-tree-inserter/discuss/178424/C%2B%2BJavaPython-O(1)-Insert

    以bfs的顺序,用List存tree nodes:tree[i]的左孩子tree[2i+1]、右孩子tree[2i+2]

    当insert第n个node时,可以通过index找到它的parent: tree[(n-1)/2]

    initialization: time = O(n), space = O(n)

    insert: time = O(1), space = O(1)

    get_root: time = O(1), space = O(1)

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class CBTInserter {
        
        List<TreeNode> tree;
        TreeNode root;
    
        public CBTInserter(TreeNode root) {
            tree = new ArrayList<>();
            this.root = root;
            tree.add(root);
            for(int i = 0; i < tree.size(); i++) {
                if(tree.get(i).left != null) {
                    tree.add(tree.get(i).left);
                }
                if(tree.get(i).right != null) {
                    tree.add(tree.get(i).right);
                }
            }
        }
        
        public int insert(int v) {
            int size = tree.size();
            TreeNode node = new TreeNode(v);
            tree.add(node);
            if(size % 2 == 0) {
                tree.get((size - 1) / 2).right = node;
            } else {
                tree.get((size - 1) / 2).left = node;
            }
            return tree.get((size - 1) / 2).val;
        }
        
        public TreeNode get_root() {
            return tree.get(0);
        }
    }
    
    /**
     * Your CBTInserter object will be instantiated and called as such:
     * CBTInserter obj = new CBTInserter(root);
     * int param_1 = obj.insert(v);
     * TreeNode param_2 = obj.get_root();
     */

    M2: 用queue存

    ref: https://leetcode.com/problems/complete-binary-tree-inserter/discuss/178427/Java-BFS-straightforward-code-two-methods-Initialization-and-insert-time-O(1)-respectively.

    1. Traverse the binary tree by level order;
    2. If the current node has left and right child, pop it out, and add both of its children into the queue; otherwise, insert new node as its child;
    3. repeat the above till encounter the first node that does NOT have two children.

    initialization: time = O(n), space = O(n)

    insert: time = O(1), space = O(1)

    get_root: time = O(1), space = O(1)

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class CBTInserter {
        
        Queue<TreeNode> q;
        TreeNode root;
    
        public CBTInserter(TreeNode root) {
            this.root = root;
            q = new LinkedList<>();
            q.offer(root);
            while(q.peek().left != null && q.peek().right != null) {
                q.offer(q.peek().left);
                q.offer(q.peek().right);
                q.poll();
            }
        }
        
        public int insert(int v) {
            TreeNode node = q.peek();
            if(node.left == null) {
                node.left = new TreeNode(v);
            } else {
                node.right = new TreeNode(v);
                q.offer(node.left);
                q.offer(node.right);
                q.poll();
            }
            return node.val;
        }
        
        public TreeNode get_root() {
            return root;
        }
    }
    
    /**
     * Your CBTInserter object will be instantiated and called as such:
     * CBTInserter obj = new CBTInserter(root);
     * int param_1 = obj.insert(v);
     * TreeNode param_2 = obj.get_root();
     */
  • 相关阅读:
    判断无向图G是否连通
    图的深度优先搜索与广度优先搜索
    整数变换问题
    按层次遍历二叉树
    交叉链表
    二元查找树转换成一个排序的双向链表
    简单计算器的实现
    二叉树宽度的计算
    BMP文件的读取与显示
    约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/fatttcat/p/11161508.html
Copyright © 2020-2023  润新知