难度中等119收藏分享切换为英文接收动态反馈
完全二叉树 是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。
设计一种算法,将一个新节点插入到一个完整的二叉树中,并在插入后保持其完整。
实现 CBTInserter
类:
CBTInserter(TreeNode root)
使用头节点为 root
的给定树初始化该数据结构;
CBTInserter.insert(int v)
向树中插入一个值为 Node.val == val
的新节点 TreeNode
。使树保持完全二叉树的状态,并返回插入节点 TreeNode
的父节点的值 ;
CBTInserter.get_root()
将返回树的头节点。
示例 1:
1 2 3 4 5 6 7 8 9 10 11 输入 ["CBTInserter" , "insert" , "insert" , "get_root" ] [[[1 , 2 ]], [3 ], [4 ], []] 输出 [null, 1 , 2 , [1 , 2 , 3 , 4 ]] 解释CBTInserter cBTInserter = new CBTInserter ([1 , 2 ]); cBTInserter.insert(3 ); // 返回 1 cBTInserter.insert(4 ); // 返回 2 cBTInserter.get_root(); // 返回 [1 , 2 , 3 , 4 ]
提示:
树中节点数量范围为 [1, 1000]
0 <= Node.val <= 5000
root
是完全二叉树
0 <= val <= 5000
每个测试用例最多调用 insert
和 get_root
操作 104
次
题解 要想找到完全二叉树的插入位置,可以想到主要是找到未满的一层的上一层的父节点,也就是按照层序遍历中存在的左右子节点缺失的结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 public class CBTInserter { TreeNode root; List<TreeNode> travelList = new ArrayList <>(); int idx; public CBTInserter (TreeNode root) { this .root = root; travelList.add(root); int cur = 0 ; while (cur < travelList.size()) { TreeNode node = travelList.get(cur); if (node.left != null ) travelList.add(node.left); if (node.right != null ) travelList.add(node.right); cur++; } } public int insert (int val) { TreeNode node = new TreeNode (val); while (travelList.get(idx).left != null && travelList.get(idx).right != null ) idx++; TreeNode fa = travelList.get(idx); if (fa.left == null ) fa.left = node; else fa.right = node; travelList.add(node); return fa.val; } public TreeNode get_root () { return root; } }
时间复杂度:$O(n)$-二叉树结点数
空间复杂度:$O(n)$-二叉树结点数