【剑指offer】面试题7-重建二叉树

题目

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

1. 思路

(1)确定根
(2)左右递归建树
------>为了方便递归传参,代码中使用了//arraycopy()方法初始化每次用于构建新子树的两个数组。
arraycopy()方法用于将一个数组的元素快速拷贝到另一个数组。在使用时需要注意避免发生数组越界,即目标数组的空间不足。

//形式:
System.arraycopy(src, srcPos, dest, destPos, length);

//参数介绍:
src 	--> 源数组
srcPos	--> 源数组中拷贝元素的起始位置。
dest 	--> 目标数组
destPos --> 拷贝到目标数组的起始位置
length 	--> 被拷贝元素的个数

2. 代码(Java实现)

// 树节点定义
public class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode(int x) { val = x; }

}
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode  tree = new TreeNode(pre[0]);
        int length = pre.length;
        if(length == 1) {
        	tree.left = tree.right = null;
        	return tree;
        }
        else { 
            int index = 0;
            while(index < in.length){
            	if(in[index] == tree.val) {
            		//在中序序列中找到根的位置下标index记录下来
            		break;
            	}
            	index++;
            }
            
            //递归构建左子树
            if(index > 0) {
                int [] preleft = new int [index];  //左子树的pre数组
                int [] inleft = new int [index];   //左子树的in数组
                System.arraycopy(pre, 1, preleft, 0, index);//arraycopy()方法,很方便
                System.arraycopy(in, 0, inleft, 0, index);
                tree.left = reConstructBinaryTree(preleft, inleft);//递归调用
            }else {
            	tree.left = null;	//index = 0,代表左边没节点,左子树空
            }
            
             //递归构建右子树
            int rlen = length - index - 1;
            //怕麻烦,就先用变量代替rlen出来了这个长度,如果不对的话也方便修改,只修改等号右边就可以
            if(rlen > 0) {
            	int [] preright = new int [rlen];	//右子树的pre数组
            	int [] inright = new int [rlen];	//右子树的in数组
                System.arraycopy(pre, index + 1, preright, 0, rlen);	
                System.arraycopy(in, index + 1, inright, 0, rlen);
                reConstructBinaryTree(preright, inright);
                tree.right = reConstructBinaryTree(preright, inright);//递归调用
            }else {
            	tree.right = null;	//length - index - 1 = 0,代表右边没节点,右子树空
            }
            return tree;
        }
    }
}
发布了13 篇原创文章 · 获赞 9 · 访问量 128

猜你喜欢

转载自blog.csdn.net/flower_48237/article/details/104045941
今日推荐