• 105. 从前序与中序遍历序列构造二叉树


     思路:前序是根左右,前序序列第一个元素一定是根。中序是左,根,右。根节点左边一定是左子树,右边一定是右子树。

    树没有重复元素,所以,先找出根节点,初始化一个TreeNode   root,再根据数值相同,找中序遍历里面的根节点,之后用Arrays.copyOfRange(preorder,1,num+1),求出先序遍历,中序遍历下的左右子树的序列,递归调用函数,返回左右子树根节点,最后root连接一下左右子树,返回root就行。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {//看笔记
        public TreeNode buildTree(int[] preorder, int[] inorder) {
            if(preorder.length>0&&inorder.length>0)
            {
                TreeNode root =new TreeNode(preorder[0]);//根节点
    
            
            int num=0;//根节点在中序序列里的下标
            for(int i=0;i<inorder.length;i++)
            {
                if(inorder[i]==root.val)
                {
                    num=i;//num是下标,左子树加根节点总共num+1个,左子树num个元素
                    break;
                }
            }
            int[] preLeft = Arrays.copyOfRange(preorder,1,num+1);//取数组里[a,b)区间的元素,这里是取了num个
            int[] preRight = Arrays.copyOfRange(preorder,num+1,preorder.length);//取出剩下的元素组成的数组,也就是右子树的元素的数组
            int[] inLeft=Arrays.copyOfRange(inorder,0,num);//取出中序遍历里面,左子树的元素组成的数组
            int[] inRight=Arrays.copyOfRange(inorder,num+1,inorder.length);
            root.left=buildTree(preLeft,inLeft);
            root.right=buildTree(preRight,inRight);
            return root;
            }
            else
            {
                return null;
            }
        }
    }
    

      

  • 相关阅读:
    密码验证合格程序(Python)
    Python找到所有子集
    Semi-Supervised Classification with Graph Convolutional Networks 阅读笔记
    2018 ICPC南京网络赛 L Magical Girl Haze 题解
    2018 CCPC网络赛 hdu6444 Neko's loop
    2018 CCPC 网络赛 Buy and Resell
    实对称矩阵可对角化证明
    矩阵的极分解证明
    关于欧几里得空间上的仿射变换的直观几何理解
    Codeforces Hello 2018 E题Logical Expression dp+最短路 好题
  • 原文地址:https://www.cnblogs.com/lzh1043060917/p/12835188.html
Copyright © 2020-2023  润新知