题目
- 通过给定的前序和后序遍历数组,重建二叉树
解法
// 构建数结构
public class BSTNode<T extends Comparable<T>> {
T key;
BSTNode<T> left;
BSTNode<T> right;
BSTNode<T> parent;
public BSTNode(T key, BSTNode<T> parent, BSTNode<T> left, BSTNode<T> right) {
this.key = key;
this.parent = parent;
this.left = left;
this.right = right;
}
}
/**
* 通过前序遍历和中序遍历数组重建二叉树
*
* @param pre
* @param in
* @return
*/
public static BSTNode<Integer> reConstructBinaryTree(int[] pre, int[] in) {
if (pre == null || in == null || in.length < 1 || pre.length != in.length)
return null;
BSTNode<Integer> root = reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
return root;
}
private static BSTNode<Integer> reConstructBinaryTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
if (startPre > endPre || startIn > endIn)
return null;
BSTNode<Integer> root = new BSTNode<>(pre[startPre], null, null, null);
for (int i = startIn; i <= endIn; i++)
if (in[i] == pre[startPre]) {
int leftCount = i - startIn;
root.left = reConstructBinaryTree(pre, startPre + 1, startPre + leftCount, in, startIn, i - 1);
root.right = reConstructBinaryTree(pre, leftCount + startPre + 1, endPre, in, i + 1, endIn);
}
return root;
}
main测试方法
public static void main(String[] args) {
int[] preorder = {3, 9, 20, 15, 7};
int[] inorder = {9, 3, 15, 20, 7};
BSTNode<Integer> tree = BinaryTree.reConstructBinaryTree(preorder, inorder);
printTree(tree);
}
private static void printTree(BSTNode<Integer> tree) {
if (tree != null) {
System.out.println(tree.key);
printTree(tree.left);
printTree(tree.right);
}
}
日志
3
9
20
15
7
通过日志查看构建后的树前序遍历结果与给定前序遍历数组相同