zoukankan      html  css  js  c++  java
  • 重建二叉树

     问题描述:

        输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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 ;
        }
    }
  • 相关阅读:
    清除浮动的方法
    网页滚动到顶部或底部加载
    任意两个数之间的随机数
    每五个一行
    js放大镜
    HTML5本地存储
    jquery checkbox radio 标签 选中的3种方法
    jquery mouseout mouseover 多次执行
    CentOS6.5安装MySQL5.7(也适合其他版本安装)
    ubuntu下ganglia3.7.2编译安装
  • 原文地址:https://www.cnblogs.com/xianbin7/p/10438705.html
Copyright © 2011-2022 走看看