public class BinaryTreeTest {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public static void main(String args[]) {
int[] pre = {1, 2, 4, 7, 3, 5, 6, 8}; // 前序遍历
int[] in = {4, 7, 2, 1, 5, 3, 8, 6}; // 中序遍历
reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
}
private static TreeNode reConstructBinaryTree(int[] pre, int preLeft, int preRight, int[] in, int inLeft, int inRight) {
if (preLeft > preRight || inLeft > inRight) {
return null;
}
TreeNode mRootNode = new TreeNode(pre[preLeft]); // 前序遍历的第一个为根
for (int i = inLeft; i <= inRight; i++) { // 用根值在中序遍历中匹配得出左、右子树部分
if (pre[preLeft] == in[i]) {
mRootNode.left = reConstructBinaryTree(pre, preLeft + 1, preLeft + i, in, inLeft, i - 1);
mRootNode.right = reConstructBinaryTree(pre, preLeft + 1 + i - inLeft, preRight, in, i + 1, inRight);
}
}
System.out.print(mRootNode.val + " ");
return mRootNode;
}
}
要点提示:
- 1、通过前序的第一个值获取根节点,通过根节点与中序的特点获取到左子树区和右子树区
- 2、递归获取根节点,打印出后序遍历值