递归遍历
前序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<Integer> list = new LinkedList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if(root != null){
list.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
}
return list;
}
}
非递归遍历(迭代)
前序遍历
记录中间节点,同时处理中间节点,把左右节点放回去。
public List<Integer> preorderTraversal(TreeNode root) {
//前序遍历 中 左 右 ,先把自己放进去,再放右节点 再放左节点
Deque<TreeNode> stack = new LinkedList<>();
List<Integer> list = new ArrayList<>();
if(root == null){
return list;
}
stack.push(root);
while(!stack.isEmpty()){
TreeNode ret = stack.pop();
list.add(ret.val);
if(ret.right != null){
stack.push(ret.right);
}
if(ret.left != null){
stack.push(ret.left);
}
}
return list;
}
中序遍历
整理清楚前后逻辑,一直寻找左节点依次填入直到为空,则把中间节点添加进去,然后指针指向右节点并开始处理;
public List<Integer> inorderTraversal(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<>();
List<Integer> list = new LinkedList<>();
if(root == null){
return list;
}
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
if(cur != null){
stack.push(cur);
cur = cur.left;
}else{
cur = stack.pop();
list.add(cur.val);
cur = cur.right;
}
}
return list;
}
后序遍历
注意list 使用add方法
stack使用push方法
public List<Integer> postorderTraversal(TreeNode root) {
//后序遍历要求 左右中 记录顺序 中 右 左 然后翻转
Deque<TreeNode> stack = new LinkedList<>();
List<Integer> list = new LinkedList<>();
if(root == null){
return list;
}
stack.push(root);
while(!stack.isEmpty()){
TreeNode cur = stack.pop();
list.add(cur.val);
if(cur.left != null){
stack.push(cur.left);
}
if(cur.right != null){
stack.push(cur.right);
}
}
Collections.reverse(list);
return list;
}