BFS
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
| class CBTInserter {
private final TreeNode root;
public CBTInserter(TreeNode root) { this.root = root; }
public int insert(int v) { TreeNode leftmost = null;
Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { for (int i = queue.size(); i > 0; i--) { TreeNode node = queue.poll(); if (i == queue.size()) { leftmost = node; } if (node.left == null) { node.left = new TreeNode(v); return node.val; } else { queue.offer(node.left); } if (node.right == null) { node.right = new TreeNode(v); return node.val; } else { queue.offer(node.right); } } }
leftmost.left = new TreeNode(v); return leftmost.val; }
public TreeNode get_root() { return root; }
}
|
BFS
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
| class CBTInserter {
private final List<TreeNode> list; private int lastIndex;
public CBTInserter(TreeNode root) { this.list = new ArrayList<>(); list.add(root); int index = 0;
while (index < list.size()) { TreeNode node = list.get(index); if (node.left != null) { list.add(node.left); } if (node.right != null) { list.add(node.right); }
index++; } }
public int insert(int v) { TreeNode newNode = new TreeNode(v); while (list.get(lastIndex).left != null && list.get(lastIndex).right != null) { lastIndex++; }
TreeNode parentNode = list.get(lastIndex); if (parentNode.left == null) { parentNode.left = newNode; } else if (parentNode.right == null) { parentNode.right = newNode; }
list.add(newNode); return parentNode.val; }
public TreeNode get_root() { return list.get(0); } }
|
BFS
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
| class CBTInserter {
private final TreeNode root; private final Queue<TreeNode> candidateQueue;
public CBTInserter(TreeNode root) { this.root = root; this.candidateQueue = new LinkedList<>();
Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); }
if (node.left == null || node.right == null) { candidateQueue.offer(node); } } }
public int insert(int val) { TreeNode child = new TreeNode(val); TreeNode node = candidateQueue.peek(); if (node.left == null) { node.left = child; } else { node.right = child; candidateQueue.poll(); } candidateQueue.offer(child);
return node.val; }
public TreeNode get_root() { return root; }
}
|
919 存在错误的测试用例,即 root 不是完全二叉树,导致不能 AC,需要等官方修复。
References
919. Complete Binary Tree Inserter
剑指 Offer II 043. 往完全二叉树添加节点