遍历记不住,搞不会,题目没思路,有思路时又写不出
前序、中序、后序,指的是根节点的位置,即根节点先访问、中间访问、最后访问三种,层序遍历是按照树层次结果遍历
递归三个要素:
- 函数的参数和返回值
- 终止条件
- 单层循环的逻辑
- 前序遍历
- 递归写法
- 非递归写法
- 中序遍历
- 递归写法
- 非递归写法
- 后序遍历
- 递归写法
- 非递归写法
- 层序遍历
9月24日考试又没有写出来
思路:二叉树分好多层,因为要按层遍历,所以如果直接采用函数递归的话,一下子就深入层底了,达不到按层的目的,所以要换一个角度,用队列 !!!
- 把根节点A放入队列,此时队列为:A,队列头为A
- 出A,把当前队列头元素A的左右儿子放入队列,即将B E放入队列,此时队列为B E
- 不断重复2步骤。A进,出A进BE,出B进CD,出E进F,出C,出D,出F
- 结束条件,队列为空时结束
所有节点都进去队列一次,然后再出队列一次,就是按层遍历,这个队列是动态的,只要有子节点,子节点就会不停的加入队尾,但总有子节点没有的时候,队列空了就结束了
public List<Integer> levelOrder(TreeNode root) {
Queue<TreeNode> que = new LinkedList(); // 层序遍历核心队列
List<Integer> list = new ArrayList<>(); // 存放结果val
que.add(root); // A 节点入队列
while (!que.isEmpty()) { // 整个队列为空时,结束
//int size = que.size(); // 提前固定每一层的个数,因为que是一直在变化的
//for (int i = 0; i < size; i++){ //遍历当前一层数据
TreeNode tmp = que.poll(); // A 节点出队列,后续逐个出队列
if (tmp != null) { // 不为空时,存入结果val,并将左右子树 入队列
list.add(tmp.val);
que.add(tmp.left);
que.add(tmp.right);
}
}
System.out.println(list);
return list;
}