前序遍历
什么是二叉树的前序遍历? 简单来说就是 “根左右”,展开来说就是对于一颗二叉树优先访问其根节点,然后访问它的左子树,等左子树全部访问完了再访问其右子树,而对于子树也按照之前的访问方式,直到到达叶子节点。
从上述前序遍历的解释中我们不难发现,它存在递归的子问题:每次访问一个节点之后,它的左子树是一个要前序遍历的子问题,它的右子树同样是一个要前序遍历的子问题。那我们可以用递归处理:
终止条件: 当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
**返回值:**每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
本级任务:每个子问题优先访问这棵子树的根节点,然后递归进入左子树和右子树。
因此处理的时候,过程就是:
step 1:准备数组用来记录遍历到的节点值,Java可以用List,C++可以直接用vector。
step 2:从根节点开始进入递归,遇到空节点就返回,否则将该节点值加入数组。
step 3:依次进入左右子树进行递归。
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型一维数组
*/
public int[] preorderTraversal (TreeNode root) {
// write code here
//用数组来记录遍历到地节点值
List<Integer> list = new ArrayList<>();
dfs(list,root);
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
public void dfs(List<Integer> list,TreeNode root) {
if(root != null) {
list.add(root.val);
dfs(list,root.left);
dfs(list,root.right);
}
}
}
中序遍历
解题思路:
什么是二叉树的中序遍历,简单来说就是“左根右”,展开来说就是对于一棵二叉树,我们优先访问它的左子树,等到左子树全部节点都访问完毕,再访问根节点,最后访问右子树。同时访问子树的时候,顺序也与访问整棵树相同。
从上述对于中序遍历的解释中,我们不难发现它存在递归的子问题,根节点的左右子树访问方式与原本的树相同,可以看成一颗树进行中序遍历,因此可以用递归处理:
终止条件:当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
返回值:每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
本级任务:每个子问题优先访问左子树的子问题,等到左子树的结果返回后,再访问自己的根节点,然后进入右子树。
因此处理的时候,过程就是:
step 1:准备数组用来记录遍历到的节点值,Java可以用List,C++可以直接用vector。
step 2:从根节点开始进入递归,遇到空节点就返回,否则优先进入左子树进行递归访问。
step 3:左子树访问完毕再回到根节点访问。
step 4:最后进入根节点的右子树进行递归。
代码:
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型一维数组
*/
public int[] inorderTraversal (TreeNode root) {
// write code here
//中序遍历,遵循 左--根--右
//中序遍历 遵循左--->根--->右
//创建一个集合来存储遍历的结点值
List<Integer> list = new ArrayList<>();
zx(list,root);
int[] arr = new int[list.size()];
for(int i = 0;i<arr.length;i++){
//将集合中的元素转存到数组中
arr[i] = list.get(i);
}
return arr;
}
private void zx(List<Integer> list,TreeNode root){
//递归到底情况
if(root==null){
return;
}
//遍历左树
zx(list,root.left);
//存入结点
list.add(root.val);
//遍历右树
zx(list,root.right);
}
}
后序遍历:
就是讲上面的代码中的改变一下顺序即可,就是所谓的“左右根”;
这个左右根就是说插入的顺序,代码应该是
//遍历左树
zx(list,root.left);
//遍历右树
zx(list,root.right);
//存入结点
list.add(root.val);
我这个代码只是简写了一下,