代码随想录算法训练营第十四天| 二叉树相关递归遍历以及迭代遍历
二叉树的递归遍历
递归三要素:确定递归函数的参数和返回值,确定终止条件,确定单层递归的逻辑

144. 二叉树的前序遍历
https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
preorder(root,list);
return list;
}
public void preorder(TreeNode root , List<Integer> list){
if (root == null) return;
list.add(root.val);
preorder(root.left,list);
preorder(root.right,list);
}
前序迭代
public List<Integer> preorderTraversal(TreeNode root) {
Deque<TreeNode> deque = new ArrayDeque<>();
List<Integer> list = new ArrayList<>();
if (root != null) deque.addFirst(root);
while (!deque.isEmpty()){
TreeNode node = deque.pollFirst();
list.add(node.val);
if (node.right != null) deque.addFirst(node.right);
if (node.left != null) deque.addFirst(node.left);
}
return list;
}
总结:入栈顺序:中右左,出战顺序就是中左右
后序迭代
public List<Integer> postorderTraversal(TreeNode root) {
Deque<TreeNode> deque = new LinkedList<>();
List<Integer> list = new ArrayList<>();
if (root != null) deque.addFirst(root);
while (!deque.isEmpty()){
TreeNode node = deque.pollFirst();
list.add(node.val);
if (node.left != null) deque.addFirst(node.left);
if (node.right != null) deque.addFirst(node.right);
}
Collections.reverse(list);
return list;
}
总结:入栈顺序:中左右,出栈顺序:中右左,再list翻转,就是左右中了。
中序迭代
public List<Integer> inorderTraversal(TreeNode root) {
Deque<TreeNode> deque = new LinkedList<>();
List<Integer> list = new ArrayList<>();
TreeNode p = root;
while (p != null || !deque.isEmpty()){
if (p != null){
deque.addFirst(p);
p = p.left;
}else {
p = deque.pollFirst();
list.add(p.val);
p = p.right;
}
}
return list;
}
总结:中序迭代和前序后序的不一样,中序迭代核心思想:让p一路向左,当p没有左了,栈弹出并p指向他,加入list,p再向右,这样就完成了左中右的操作,注意中序迭代要放在一个while循环里,因为每次想加入list的前提就是当前的p节点没有左孩子。
层序遍历非递归
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> resList = new ArrayList<>();
Deque<TreeNode> deque = new LinkedList<>();
if (root == null) return resList;
deque.offer(root);
while (!deque.isEmpty()){
List<Integer> list = new ArrayList<>();
int size = deque.size();
for (int i = 0; i < size; i++) {
TreeNode node = deque.poll();
list.add(node.val);
if (node.left != null) deque.offer(node.left);
if (node.right != null) deque.offer(node.right);
}
resList.add(list);
}
return resList;
}
总结:注意for循环中如果写i < deque.size()会发生错误,因为每次for循环deque的长度都在变。
层序遍历递归
//todo
浙公网安备 33010602011771号