重建二叉树
问题描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解决方案:
考虑一下特殊情况即可:
// 考虑无左子树右子树的情况,即根节点位于中序序列最左端或者最右端。
// 特殊输入: 1 中序序列为空或者先序序列为空
// 递归停止条件: 当到达叶字节点时
/** * 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) { /**输入特殊情况处理*/ if (pre == null || in == null) { //如果前序或者中序有一个是空直接返回 return null; } return ConstructCore(pre, 0, pre.length -1 , in, 0, in.length -1 ); } public TreeNode ConstructCore(int [] pre, int startPreOrder, int endPreOrder, int [] in, int startInOrder, int endInOrder ) { if (startPreOrder > endPreOrder || startInOrder > endInOrder) { //停止递归的条件 return null; } TreeNode treeNode = new TreeNode(pre[startPreOrder]); if(startPreOrder == endPreOrder){ return treeNode; } int rootPosition = 0; for(int i=startInOrder; i<= endInOrder; i++){ if(in[i] == pre[ startPreOrder ]){ rootPosition = i; break; } } int leftLength = rootPosition - startInOrder ; // 考虑无左子树右子树的情况,根节点位于中序序列最左端或者最右端。 // 特殊输入: 1 中序序列为空或者先序序列为空 // 递归停止条件: 当到达叶字节点时 if(leftLength > 0 ){ treeNode.left = ConstructCore(pre, startPreOrder+1, startPreOrder + leftLength, in, startInOrder, rootPosition - 1 ); } if( leftLength < endPreOrder - startPreOrder){ treeNode.right = ConstructCore(pre, startPreOrder + leftLength + 1 , endPreOrder, in, rootPosition + 1, endInOrder); } return treeNode ; } }