首先我们来看看题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思想:首先找到根结点,将其分为左子树和右子树,在寻找左(右)子树中的根节点,再将其分为左子树和右子树,这样不断地递归下去,直到达到树的子节点。
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { //确定长度 int nn = 0; int len = in.length; if (len == 0){ return null; } TreeNode treeNode = new TreeNode(pre[0]); //记录根节点在中序遍历数组中的index for(int i = 0; i <len; i++){ if (pre[0] == in[i]){ nn = i; break; } } //建立存储前序遍历中的左子树和右子树的整型数组 int[] pre_Left=new int[nn]; int[] pre_Right=new int[len-nn-1]; //建立存储中序遍历中的左子树和右子树的整型数组 int[] in_Left=new int[nn]; int[] in_Right=new int[len-nn-1]; //赋值给对应的数组 for( int i=0;i<nn;i++){ pre_Left[i]=pre[i+1]; in_Left[i]=in[i]; } //注意这里,i要减去nn+1之后才是从0开始给数组re_Right and in_Right赋值 for( int i=nn+1;i<len;i++){ pre_Right[i-nn-1]=pre[i]; in_Right[i-nn-1]=in[i]; } //采用递归的方法分别返回根节点对应的左子节点和右子节点 treeNode.left=reConstructBinaryTree(pre_Left,in_Left); treeNode.right=reConstructBinaryTree(pre_Right,in_Right); return treeNode; } }
重建二叉树
最新推荐文章于 2024-05-07 14:33:09 发布