【Java】BST树的经典问题——二叉树的重建

在了解了二叉树的前、中、后序遍历后,我们则可以直到,中序遍历可以得出左右子树前序遍历可以得到父节点
如:
当得到一个数组的中序遍历是: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;//返回这个父节点
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值