概述:
主要讲解前序遍历、中序遍历、后序遍历的Java代码实现。
正文:
对下图所示二叉树为测试对象:
二叉树基于如下的数据结构:
public class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int x) { val=x; }
}
1.前序遍历:
void preOrderTraverse(TreeNode node) {
if(node==null) return;
System.out.println(node.val);
preOrderTraverse(node.left);
preOrderTraverse(node.right);
}
2.中序遍历
void inOrderTraverse(TreeNode node) {
if(node==null) return;
inOrderTraverse(node.left);
System.out.println(node.val);
inOrderTraverse(node.right);
}
3.后序遍历
void postOrderTraverse(TreeNode node) {
if(node==null) return;
postOrderTraverse(node.left);
postOrderTraverse(node.right);
System.out.println(node.val);
}
以上的这三个算法实现都是直接打印数据,假设我们需要把数据存储到一个数组中然后再返回的,代码如何实现呢?
见下方所示:
/*递归的主要实现是函数 recur(ArrayList<Integer> res, TreeNode node),与上方的没有返回值的前中后序遍历的代码不同,recur()方法接受两个参数,一个是用于存储结果数据的res,另外一个才是用于后序递归的子树node */
public int[] preOrderTraverse_(TreeNode node) {
//因为是树结构,无法知道节点个数,所以建立数组列表,而不是普通数组
ArrayList<Integer> res=new ArrayList<>();
recur(res,node);//递归函数
//将递归产生的res数组列表转化为数组
int[] result=new int[res.size()];
for(int i=0; i<res.size(); i++)
result[i]=res.get(i);
return result;
}
//递归函数定义:前序遍历
private void recur(ArrayList<Integer> res, TreeNode node){
if(node==null) return;
res.add(node.val);
recur(res,node.left);
recur(res,node.right);
}
测试代码如下:
public class CodeTest {
public static void main(String[] args) {
TreeNode node1=new TreeNode(1);
TreeNode node3=new TreeNode(3);
TreeNode node5=new TreeNode(5);
TreeNode node2=new TreeNode(2,node1,node3);
TreeNode node4=new TreeNode(4,node2,node5);
System.out.println(Arrays.toString(preOrderTraverse_(node4)));
}
public static int[] preOrderTraverse_(TreeNode node) {
//因为是树结构,无法知道节点个数,所以建立数组列表,而不是普通数组
ArrayList<Integer> res=new ArrayList<>();
recur(res,node);//递归函数
//将递归产生的res数组列表转化为数组
int[] result=new int[res.size()];
for(int i=0; i<res.size(); i++)
result[i]=res.get(i);
return result;
}
//递归函数定义:前序遍历
private static void recur(ArrayList<Integer> res, TreeNode node){
if(node==null) return;
res.add(node.val);
recur(res,node.left);
recur(res,node.right);
}
}
//树的数据结构
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val=x; }
TreeNode(int x, TreeNode l, TreeNode r){
val=x;
left=l;
right=r;
}
}
测试代码运行结果为:
[4,2,1,3,5]