通过万岁!!!
- 题目:就是构建一颗完全二叉树,然后会不断的往完全二叉树中插入元素,要求插入以后,还是完全二叉树。然后插入的时候,返回这个插入的位置的父节点的元素的值。
- 思路:其实就是按照完全二叉树的顺序进行插入即可。我们可以发现,其实就是层序遍历,我们只要看一下队头的元素左右是不是能放,先放他的左边,然后放他的右边。放完了以后,这个就可以出去了,并且你添加的这个元素,要放入队尾。构造方法,我们就直接构建这个队列,但是需要注意,构造方法的时候,这个队列只能加入,不能进行删除,所以需要一个temp队列来辅助。队列中存放的是叶子节点以及只有左子树的非叶子节点(只有左子树的非叶子的最多只有一个)。但是最开始的时候,我们很难知道谁是要求的节点,所以可以都放进去,然后再第一个insert的时候,就会删除掉。
- 技巧:层序遍历
java代码
class CBTInserter {
TreeNode root = new TreeNode();
Queue<TreeNode> queue = new LinkedList<>();
public CBTInserter(TreeNode root) {
this.root = root;
Queue<TreeNode> temp = new LinkedList<>();
temp.add(root);
queue.add(root);
int size;
while (!temp.isEmpty()) {
size = temp.size();
for (int i = 0; i < size; i++) {
TreeNode remove = temp.remove();
if (null != remove.left) {
temp.add(remove.left);
queue.add(remove.left);
}
if (null != remove.right) {
temp.add(remove.right);
queue.add(remove.right);
}
}
}
}
public int insert(int val) {
while (!queue.isEmpty()) {
TreeNode peek = queue.peek();
if (null == peek.left) {
TreeNode treeNode = new TreeNode(val);
peek.left = treeNode;
queue.add(treeNode);
return peek.val;
}
if (null == peek.right) {
TreeNode treeNode = new TreeNode(val);
peek.right = treeNode;
queue.add(treeNode);
queue.remove();
return peek.val;
}
queue.remove();
continue;
}
return val;
}
public TreeNode get_root() {
return root;
}
}
- 总结:题目不是特别难,主要是需要熟练掌握层序遍历,也就是广度优先。