代码随想录day14|二叉树的前序遍历. 二叉树的后序遍历. 二叉树的中序遍历
二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前/中/后序 遍历。
分析 递归写法 1, 确定递归函数的参数和返回值 2, 明确终止条件 (到达空节点) 2确定单层递归的逻辑:前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
preOrder(root,res);
return res;
}
public void preOrder(TreeNode root,List<Integer> res ){
if(root==null) return ;
res.add(root.val);
preOrder(root.left,res);
// res.add(root.val);
preOrder(root.right,res);
// res.add(root.val);
} }
分析 前序迭代写法 前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子 (为了保证出栈顺序是 中左右)
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res= new ArrayList<>();
Deque<TreeNode> deque = new LinkedList<>();
if(root==null) return res;
deque.offer(root);
TreeNode temp;
while(!deque.isEmpty()){
temp=deque.pollLast();
res.add(temp.val);
if(temp.right!=null){
deque.offer(temp.right);
}
if(temp.left!=null){
deque.offer(temp.left);
}
}
return res;
}
}
分析 中序迭代法 中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中)
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<>();
if(root==null) return res;
Deque <TreeNode> deque= new LinkedList<>();
TreeNode cur= root;
while(cur!=null||!deque.isEmpty()){
if(cur!=null){
deque.offer(cur);
cur= cur.left;
}else if(cur==null){
cur=deque.pollLast();
res.add(cur.val);
cur=cur.right;
}
}
return res;
}
}
分析 后序遍历 后序遍历顺序 左-右-中 入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<>();
Deque<TreeNode> deque = new LinkedList<>();
if(root==null) return res;
deque.offer(root); while(!deque.isEmpty()){ TreeNode temp = deque.pollLast(); res.add(temp.val); if(temp.left!=null){ deque.offer(temp.left); } if(temp.right!=null){ deque.offer(temp.right); } } Collections.reverse(res); return res; } }

浙公网安备 33010602011771号