大家好,我是程序员walker
一个持续学习,分享干货的博主
关注公众号【I am Walker】,一块进步
树的遍历一般分为两种形式,有递归遍历和迭代方式
这里介绍的是递归方式
递归的定义:
程序调用自身的编程技巧称为递归( recursion)。
递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归过程
递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
代码模板
void recur(参数){
//边界条件
//调用本身
}
leetcode题目
144.二叉树的前序遍历
94.二叉树的中序遍历
145.二叉树的后序遍历
遍历分类
主要有三种:
前序遍历
中序遍历
后序遍历
树的前中后序是以根节点作为视角的
前序遍历
先遍历中,然后左边,再右边
中序遍历
左,中,右
后序遍历
左,右,中
演示代码
TreeNode类
package tree;
public class TreeNode {
public int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
代码
package tree;
import java.util.ArrayList;
import java.util.List;
public class Tranversal {
public List<Integer> order(TreeNode root){
List<Integer> res = new ArrayList<>();
//前序
// preOrderRecur(root,res);
//中序
// midOrderRecur(root,res);
//后续
afterOrderRecur(root,res);
return res;
}
/**
* 前序
*/
private void preOrderRecur(TreeNode treeNode,List<Integer> res){
if(treeNode==null) return;
res.add(treeNode.val);
preOrderRecur(treeNode.left,res);
preOrderRecur(treeNode.right,res);
}
/**
* 中序
*/
private void midOrderRecur(TreeNode root,List<Integer> res){
//需要先进行判空
if(root==null) return;
midOrderRecur(root.left,res);
res.add(root.val);
midOrderRecur(root.right,res);
}
/**
* 后序
*/
private void afterOrderRecur(TreeNode root,List<Integer> res){
if(root==null) return;
afterOrderRecur(root.left,res);
afterOrderRecur(root.right,res);
res.add(root.val);
}
}