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;
        }
    }
  • 相关阅读:
    volatile详解
    Java并发之AQS详解
    Thread详解
    Hibernate检索策略
    Hibernate查询方式
    Hibernate--对象关系
    hibernate--hibernate.cfg.xml常用配置详解
    hibernate--CRUD初体验
    hibernate--HelloWorld
    Struts支持的contentType
  • 原文地址:https://www.cnblogs.com/wxisme/p/5236171.html
Copyright © 2011-2022 走看看