在了解了二叉树的前、中、后序遍历后,我们则可以直到,中序遍历可以得出左右子树,前序遍历可以得到父节点。
如:
当得到一个数组的中序遍历是:12 18 23 35 47 58 69 74 82 87 95
前序遍历是:58 23 12 18 35 47 82 69 74 87 95
我们可以画出下面的一个BST树
代码实现如下:
public void rebuild(T[] pre, T[] in) {
//首先从前序遍历中得到他的根节点
System.out.println("重建二叉树");
rebuild(pre, 0, pre.length - 1, in, 0, in.length - 1);
}
private BSTNode<T> rebuild(T[] pre, int i, int j, T[] in, int m, int n) {//前序的两个指针ij ,中序的两个指针mn
//首先从前序遍历的第一个节点开始(即父节点)
//找到父节点后就把整个数组分成了两部分,一边右树,一边左树
if (i > j || m > n) {//左边的坐标值比右边的大,递归停止条件
return null;
}
BSTNode<T> node = new BSTNode<>(pre[i], null, null);//创建根节点
for (int k = m; k < n; ++k) {
if (pre[i].compareTo(in[k]) == 0) {//在中序中找到了根,即m~k-1为左子树 k+1~n为右子树(中序中)
//根的左前序序列【i+1,i+(k-m)】 右【i+(k-m)+1,j】
node.setLeft(rebuild(pre, i + 1, i + (k - m), in, m, k - 1));//设置他的左孩子域
node.setRight(rebuild(pre, i + (k - m) + 1, j, in, k + 1, n));//设置他的右孩子域
break;//设置完成必须返回,因为需要查找下一个根节点
}
}
return node;//返回这个父节点
}