二叉树的多种遍历方式

前序遍历(递归实现)
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list=new ArrayList<>();return prio(root,list);}public List<Integer> prio(TreeNode a,List<Integer>list){if(a==null)return list;list.add(a.val);prio(a.left,list);prio(a.right,list);return list;}
}
中序遍历(递归实现)
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list=new ArrayList<>();return zhong(root,list);}public List<Integer> zhong(TreeNode a,List<Integer>list){if(a==null)return list;zhong(a.left,list);list.add(a.val);zhong(a.right,list);return list;}
}
后序遍历(递归实现)
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list=new ArrayList<>();return hou(root,list);}public List<Integer> hou(TreeNode node,List<Integer>list){if(node==null)return list;hou(node.left,list);hou(node.right,list);list.add(node.val);return list;}
}
非递归实现中序遍历
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list=new ArrayList<>();LinkedList<TreeNode> stack=new LinkedList<>();//栈记录走过的路程//非递归实现while(root!=null||!stack.isEmpty()){if(root!=null){stack.push(root);root=root.left;}else{TreeNode pop=stack.pop();list.add(pop.val);root=pop.right;}}return list;}
}
非递归实现前序遍历
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list=new ArrayList<>();LinkedList<TreeNode> stack=new LinkedList<>();while(root!=null||!stack.isEmpty()){if(root!=null){list.add(root.val);stack.push(root);root=root.left;}else{TreeNode pop=stack.pop();root=pop.right;}}return list;}
}
后序遍历(非递归实现)
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list=new ArrayList<>();LinkedList<TreeNode> stack=new LinkedList<>();TreeNode pop=null;while(root!=null||!stack.isEmpty()){if(root!=null){stack.push(root);root=root.left;}else{TreeNode peek=stack.peek();if(peek.right==null||peek.right==pop){pop=stack.pop();list.add(pop.val);}else{root=peek.right;}}}return list;}
}
力扣——对称二叉树

判断二叉树是不是对称二叉树
代码实现(递归解法)
class Solution {public boolean isSymmetric(TreeNode root) {return duichen(root.left,root.right); }public boolean duichen(TreeNode left,TreeNode right){if(right==null&&left==null){return true;}if(right==null||left==null){return false;}if(left.val!=right.val){return false;}return duichen(left.left,right.right)&&duichen(left.right,right.left);}
}
迭代解法
力扣——二叉树的最大深度
class Solution {public int maxDepth(TreeNode root) {if(root==null)return 0;if(root.left==null&&root.right==null){return 1;}int a=maxDepth(root.left);int b=maxDepth(root.right);int i=Math.max(a,b);return i+1;}
}
力扣——二叉树的最小深度
import java.util.*;
class Solution {public int minDepth(TreeNode root) {if(root==null)return 0;int a=minDepth(root.left);int b=minDepth(root.right);int i=Math.min(a,b);//要多做一个判断,如果左子树/右子树为0,那么就以不为0的那个为准if(a==0)return b+1;if(b==0)return a+1;return i+1;}
}
力扣-翻转二叉树
class Solution {public TreeNode flipTree(TreeNode root) {fn(root);return root;}public void fn(TreeNode node){if(node==null){return;}TreeNode temp=node.left;node.left=node.right;node.right=temp;fn(node.left);fn(node.right);}
}
二叉搜索树

