【剑指offer】重建二叉树 ★★★

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

解题思路:

知道整体思路是:

在二叉树的前序遍历序列中,第一个数字总是树的根结点的值。但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边。因此我们需要扫描中序遍历序列,才能找到根结点的值。如题目给出的序列,前序遍历中的第一个数字1就是根结点的值。扫描中序遍历序列,就能确定根结点的值的位置。根据中序遍历的特点,在根结点的值1前面的3个数字都是左子树结点的值,位于1后面的数字都是右子树结点的值。这样我们就在前序遍历和中序遍历两个序列中,分别找到了左右子树对应的子序列。因此,可以用同样的方法去构建左右子树。也就是说,接下来的事情可以用递归的方法去完成。

也就是在前序遍历序列中找根节点,然后根据根节点到中序遍历序列中划分左右子树两部分,然后分别在左右子树中递归重复上述过程。

但是每次一遇到递归问题思路就好乱啊,脑子完全缠绕在一起理不清啊啊啊~~~

所以,我就每次在做题之前都先把思路画一画,这样写程序的时候就清楚一些了:

public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode root = new TreeNode(pre[0]);
        int len = pre.length;
        if(len == 1){
            root.left = null;
            root.right = null;
            return root;
        }
        else {
            // 在中序遍历序列中找到根节点的位置i
            int i;
            for (i=0;i<len;i++){
                if (in[i] == root.val) break;
            }
            //左子树,从pre[1]开始
            int [] lpre = new int[i];
            int [] lin = new int [i];
            if(i == 0){             //当前中序序列的第一个为根节点,即不存在有左节点
                root.left = null;
            }
            else{
                for (int j=0;j<i;j++){
                    lpre[j] = pre[j+1];
                    lin[j] = in[j];
                }
                root.left = reConstructBinaryTree(lpre,lin);
            }
            //右子树,从pre[i+1]开始
            int [] rpre = new int[len-i-1];
            int [] rin = new int[len-i-1];
            if (len-i-1 == 0){          //当前中序序列的最后一个为根节点,即不存在有右节点
                root.right = null;
            }
            else{
                for (int j=0;j<len-i-1;j++){
                    rpre[j] = pre[j+i+1];
                    rin[j] = in[j+i+1];
                }
                root.right = reConstructBinaryTree(rpre,rin);
            }
            return root;
        }
    }

提醒我自己:一定要记得对各种null做判断!

猜你喜欢

转载自blog.csdn.net/yingzoe/article/details/84454540