二叉树的递归主要考虑到三点:
- 递归的参数
- 递归的终止条件
- 递归的每层的逻辑规律
1. LeetCode144 二叉树的前序遍历
List<Integer> list = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
TreeNode cur=root;
if(cur!=null){
list.add(cur.val);
preorderTraversal(cur.left);
preorderTraversal(cur.right);
}
return list;
}
2. 二叉树的中序遍历
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
traversal(root,result);
return result;
}
public void traversal(TreeNode cur,List<Integer> list){
if(cur==null) return;
traversal(cur.left,list);
list.add(cur.val);
traversal(cur.right,list);
}
3. 二叉树的后序遍历**
List<Integer> list = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
TreeNode cur=root;
if(cur!=null){
postorderTraversal(cur.left);
postorderTraversal(cur.right);
list.add(cur.val);
}
return list;
}
采用迭代(栈)的方法:
需要注意的就是入栈的顺序以及循环的终止条件
1,前序遍历
List<Integer> list = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
Stack<TreeNode> stack=new Stack<>();
stack.push(root);
while(!stack.empty()){
TreeNode cur = stack.pop();
if(cur!=null){
list.add(cur.val);
}else{
continue;
}
stack.push(cur.right);
stack.push(cur.left);
}
return list;
}
2,中序遍历
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
TreeNode cur = root;
while(cur!=null || !stack.empty()){
if(cur!=null){
stack.push(cur);
cur=cur.left;
}else{
cur = stack.pop();
list.add(cur.val);
cur=cur.right;
}
}
return list;
}
3,后序遍历
//对前序遍历入栈顺序稍作调整,最后将结果进行反转。(中右左-->左右中)
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.empty()){
TreeNode cur = stack.pop();
if(cur!=null){
list.add(cur.val);
}else{
continue;
}
stack.push(cur.left);
stack.push(cur.right);
}
Collections.reverse(list);
return list;
}