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

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

    思路:知道了二叉树的前序和中序的序列就可以使用递归的方法找出根节点和左右子树了。以题目为例,首先看前序序列1一定是根节点,然后找到1在中序序列中的位置,中序序列中1前面的是左子树,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 || pre.length == 0 || in == null 
               || in.length == 0 || pre.length != in.length) {
                return null;
            }
            return build(pre, 0, pre.length-1, in, 0, in.length-1);
        }
        
        
        public TreeNode build(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
            TreeNode root = new TreeNode(pre[startPre]);
            if(startPre == endPre)
                return root;
            
            int rootPos = startIn;
            while(rootPos <= endIn && in[rootPos] != pre[startPre]) {
                rootPos ++;
            }
            
            int leftLength = rootPos - startIn;
            if(leftLength > 0) { //构造左子树
                root.left = build(pre, startPre+1, startPre+leftLength, in, startIn, rootPos-1);
            }
            
            if(endIn - rootPos > 0) { //构造右子树
                root.right = build(pre, startPre+leftLength+1, endPre, in, rootPos+1, endIn);
            }
            
            return root;
        }
    }
  • 相关阅读:
    HBase in Action前三章笔记
    关于视频YUV
    23种设计模式用英语怎样表达?
    UVA 10620
    工具,帮助我们更高效的工作
    VS下控制台执行保持(不要一闪而过)
    C语言之结构体
    Linux grep命令和正则表达式
    C#中的“静态”
    推荐一个计算机视觉图书:python计算机视觉编程
  • 原文地址:https://www.cnblogs.com/wxisme/p/5236171.html
Copyright © 2011-2022 走看看