在我们学习树的时候,发现树的遍历方式是非常重要的,
所以总结一下树的遍历方法,树的dfs分为递归和迭代实现
递归实现
递归实现又分为前中后序遍历
前序遍历:值->左孩子->右孩子
中序遍历:左结点->值->右孩子
后序遍历:左孩子->右孩子->值

中序遍历
/**
* 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> re=new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
if(root==null) return re;
inorderTraversal(root.left);
re.add(root.val);
inorderTraversal(root.right);
return re;
}
得到的结果为1->5->7->8->10->12;如果够细心的话我们发现中序遍历得到值的顺序是升序的前提这颗树是二叉搜索树(),这特性在解决树这方面的题目很有帮助!!
前序遍历
class Solution {
List<Integer> re=new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if(root==null) return re;
re.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
return re;
}
}
后序遍历
class Solution {
List<Integer> re=new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
if(root==null) return re;
postorderTraversal(root.left);
postorderTraversal(root.right);
re.add(root.val);
return re;
}
}
迭代实现
前序和中序迭代实现
class Solution {
List<Integer> re=new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
TreeNode cur=root;
Deque<TreeNode> stack=new LinkedList<>();
while(cur != null || !stack.isEmpty()){
if(cur != null){
stack.push(cur);
//前序遍历输出
re.add(cur.val);
cur=cur.left;
}else {
TreeNode pop = stack.pop();
//中序遍历输出
re.add(pop.val);
cur=pop.right;
}
}
return re;
}
后序遍历
class Solution {
//迭代遍历
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> re=new ArrayList<>();
Deque<TreeNode> stack=new LinkedList<>();
TreeNode cur=root;
TreeNode pop=null;
while (cur!=null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
//处理左子树
cur = cur.left;
} else {
TreeNode peek = stack.peek();
//没有右子树或者右子树处理完成
if (peek.right == null || peek.right == pop) {
pop = stack.pop();
re.add(pop.val);
}
//待处理的右子树
else {
cur = peek.right;
}
}
}
return re;
}
}