通过牛客网上的题目来复习一下二叉树的先序、中序和后序遍历,并用Java实现
题目大意:给定一个二叉树的根结点,分别进行先序、中序和后序遍历,将遍历得到的序列分别放在三个一维数组中,然后返回三个一维数组组成的二维数组(可类比C语言的实现来理解):
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型二维数组
*/
public int[][] threeOrders (TreeNode root) {
// write code here
int[][] result = new int[3][];
List<Integer> pre = new ArrayList<>();
List<Integer> in = new ArrayList<>();
List<Integer> post = new ArrayList<>();
preOrder(root, pre);
inOrder(root, in);
postOrder(root, post);
result[0] = new int[pre.size()];
for (int i = 0; i < result[0].length; i++) {
result[0][i] = pre.get(i);
}
result[1] = new int[in.size()];
for (int i = 0; i < result[1].length; i++) {
result[1][i] = in.get(i);
}
result[2] = new int[post.size()];
for (int i = 0; i < result[2].length; i++) {
result[2][i] = post.get(i);
}
return result;
}
public void preOrder(TreeNode root, List<Integer> pre) {
if (root == null) {
return ;
}
pre.add(root.val);
preOrder(root.left, pre);
preOrder(root.right, pre);
}
public void inOrder(TreeNode root, List<Integer> in) {
if (root == null) {
return ;
}
inOrder(root.left, in);
in.add(root.val);
inOrder(root.right, in);
}
public void postOrder(TreeNode root, List<Integer> post) {
if (root == null) {
return ;
}
postOrder(root.left, post);
postOrder(root.right, post);
post.add(root.val);
}
}
对上面的写法的优化(在一个方法中同时实现了前、中、后三种遍历,其中的求结点个数可以记一下):
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型二维数组
*/
int pre = 0;
int in = 0;
int post = 0;
public int[][] threeOrders (TreeNode root) {
// write code here
int count = nodeCount(root);
int[][] result = new int[3][count];
travel(root, result);
return result;
}
// 求出二叉树中结点的总数
public int nodeCount(TreeNode root) {
if (root == null) {
return 0;
}
return nodeCount(root.left) + nodeCount(root.right) + 1;
}
// 三种遍历同时实现
public void travel(TreeNode root, int[][] result) {
if (root == null) {
return ;
}
result[0][pre++] = root.val;
travel(root.left, result);
result[1][in++] = root.val;
travel(root.right, result);
result[2][post++] = root.val;
}
}