重建二叉树

 问题描述:

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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 ;
    }
}
原文地址:https://www.cnblogs.com/xianbin7/p/10438705.html