zoukankan      html  css  js  c++  java
  • LeetCode 105 从前序与中序遍历序列构造二叉树

    LeetCode 105 从前序与中序遍历序列构造二叉树
    问题描述:
    根据一棵树的前序遍历与中序遍历构造二叉树。
    注意:

    • 你可以假设树中没有重复的元素。

    例如,给出

    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]

    返回如下的二叉树:

    3
    /
    9 20
    /
    15 7
    执行用时:4 ms, 在所有 Java 提交中击败了47.35%的用户
    内存消耗:38.9 MB, 在所有 Java 提交中击败了93.03%的用户

    递归:

    class Solution {
        public TreeNode buildTree(int[] inorder, int[] postorder) {
            return buildTree(inorder, postorder, new int[]{0, inorder.length-1}, new int[]{0, postorder.length-1});
        }
         
        public TreeNode buildTree(int[] inorder, int[] postorder, int[] range1 ,int[] range2) {
            //递归终止
            if(range1[0]>=range1[1] || range2[0]>=range2[1]) {
                return range1[0]==range1[1]? new TreeNode(inorder[range1[0]]): null;
            }
            //从inorder中找到当前根节点
            int rootVal = inorder[range1[0]];
            int leftTreeEnd = 0, rightTreeStart = 0;
            //在postorder中找到root的左右子树节点范围
            for(int i=range2[0]; i<=range2[1]; i++) {
                if(rootVal==postorder[i]) {
                    leftTreeEnd = i-1;
                    rightTreeStart = i+1;
                }
            }
            TreeNode root = new TreeNode(rootVal);
            //递归构建左右子树
            TreeNode leftRoot = buildTree(inorder, postorder, 
                new int[]{range1[0]+1, range1[0]+leftTreeEnd+1-range2[0]}, 
                new int[]{range2[0], leftTreeEnd}
            );
            TreeNode rightRoot = buildTree(inorder, postorder, 
                new int[]{range1[0]+leftTreeEnd+2-range2[0], range1[1]},
                new int[]{rightTreeStart, range2[1]} 
            );
            root.left = leftRoot;
            root.right = rightRoot;
    
            return root;
        }
    }
    
  • 相关阅读:
    Qt 跟踪鼠标事件:setMouseTracking(true)
    Qt setMouseTracking使用
    Qt QGraphicsItem 鼠标点击事件编程方法
    Qt QGraphicsItem信号连接有关问题
    Qt 自定义QGraphicsItem
    Qt 视图框架QGraphicsItem
    Qt QGraphicsItem要点 积累
    Qt Q_UNUSED() 方法的使用
    Qt 绘图之QGraphicsScene QGraphicsView QGraphicsItem详解
    Qt 使用QGraphicsItem绘制复杂的图形
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13680703.html
Copyright © 2011-2022 走看看