二叉树遍历规则
前序规则
先遍历根节点,再遍历左节点,然后遍历右节点
中序规则
先遍历左节点,再遍历根节点,然后遍历右节点
后序规则
先遍历左节点,再遍历右节点,然后遍历根节点
例子
二叉树前序遍历(题目来自牛客网)
题解
使用递归操作,首先判断节点是否为null,不为空,将节点值加入到List中(并不再次进入递归),然后判断,左节点是否为空,不为空,进行递归。在判断右节点是否为空,不为空进行递归。
代码
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[] preorderTraversal (TreeNode root) {
if(root==null)
return new int[0];
// write code here
List a=new ArrayList();
getPerList(root,a);
int AA[] =new int[a.size()];
for(int i=0;i<a.size();i++){
AA[i]=(int) a.get(i);
}
return AA ;
}
void getPerList (TreeNode root,List a){
if(root != null){
a.add(root.val);
}
if(root.left!=null){
getPerList (root.left,a);
}
if(root.right!=null){
getPerList (root.right,a);
}
return;
}
}
二叉树中序遍历(题目来自牛客网)
题解
和上一题一样,根据中序遍历规则实现递归即可
代码
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
if(root==null){
return new int[0];
}
List a=new ArrayList();
getZhong( root , a);
int A[]=new int[a.size()] ;
for(int i=0;i<a.size();i++){
A[i]=(int)a.get(i);
}
return A;
}
void getZhong(TreeNode root ,List a){
if(root.left != null){
getZhong(root.left,a);
// a.add(root.val);
}
a.add(root.val);
if(root.right != null){
getZhong(root.right,a);
}
}
}
二叉树的后序遍历(题目来自牛客网)
题解
和上一题一样,根据后序遍历规则实现递归即可
代码
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
if(root==null){
return new int[0];
}
List a=new ArrayList();
getZhong( root , a);
int A[]=new int[a.size()] ;
for(int i=0;i<a.size();i++){
A[i]=(int)a.get(i);
}
return A;
}
void getZhong(TreeNode root ,List a){
if(root.left != null){
getZhong(root.left,a);
// a.add(root.val);
}
a.add(root.val);
if(root.right != null){
getZhong(root.right,a);
}
}
}
参数的应用传
上面三道题中,我们都使用到了一个LIst a 进行保存结点的值。其中递归方法中定义了一个形参来接收List 。其中a这个引用变量存在栈中,创建的ArrayList保存在队中,我们在递归过程中,a这个引用变量没有变,但是对他指向的队中的内存进行了插入数据的操作。