[Leetcode 105]*前序后序遍历形成树

    public TreeNode find(int[] preorder, int[] inorder,int j, int start, int end) {
        if (j > preorder.length - 1 || start > end) {
            return null;
        }
        TreeNode root = new TreeNode(preorder[j]);
        int flag = 0; 

        for (int i = start; i <= end; i++) {
            if (inorder[i] == root.val) {
                flag = i;
            }
        }
        root.left = find(preorder, inorder,j + 1,start, flag - 1);
        root.right = find(preorder, inorder,j + flag - start + 1, flag + 1, end);
        return root;
    }

so basically flag-start is size of the roots left subtree,

therefore to get the start of right subtree you gotta get to the start of the first value of right subtree within preorder.

relative start of the root + left + right tree (j) + left sub tree size (flag - start) + 1 (the root).

【flag-start】左子树的大小

【j】前序从j基础上开始遍历的

【+1】根节点

【前序遍历位置】=【基础位置J】+【左子树大小FLAG-START】+【下一节点1】

原文地址:https://www.cnblogs.com/inku/p/9953470.html

时间: 2024-08-07 07:18:23

[Leetcode 105]*前序后序遍历形成树的相关文章

51nod 1832 前序后序遍历

思路:设只有一颗子树的节点有ans个设前序边历数组为pre[100],后序遍历数组为pos[100]:前序遍历的第二个元素是A的一个子节点左右节点不知,设ax-ay表示一个树的前序遍历,bx-by表示后序遍历,可知如果pre[ax+1] = pos[i] 且 i = by-1,上一个根节点只有一个子树,此时令计数变量ans++:如果i != b2-1,很明显存在左右子树,此时应分别处理此时左子树为的前后序边历分别为:ax+1~ax+1+i-bx,bx~i,右子树为:ax+1+i-bx~ay,i+

根据前序/后序遍历和中序遍历序列建树

根据前序遍历和中序遍历序列建树: 1 // 先序序列pre[preL,preR],中序序列in[inL,inR] 2 node* BuildTree(int preL,int preR,int inL,int inR){ 3 if(preL>preR){ 4 return NULL; 5 } 6 node *root=new node; 7 root->data=pre[preL]; 8 int k; 9 for(k=inL;in[k]!=pre[preL];k++){ 10 ; 11 } 1

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

二叉树的前序、中序、后序遍历的递归和非递归算法实现

1 /** 2 * 二叉树的前序.中序.后序遍历的递归和非递归算法实现 3 **/ 4 5 //二叉链表存储 6 struct BTNode 7 { 8 struct BTNode *LChild; // 指向左孩子指针 9 ELEMENTTYPE data; // 结点数据 10 struct BTNode *RChild; // 指向右孩子指针 11 }; 12 13 /** 14 * 前序遍历 15 **/ 16 // 递归实现 17 void PreorderTraversal(BTNo

树的前序、中序、后序遍历的JAVA实现

[注]后续实现第二种方法暂时未解出 1 package com.exe4.offer; 2 3 import java.util.Stack; 4 5 /** 6 * 前序.中序.后序遍历方法 7 * @author WGS 8 * 9 */ 10 public class BianliOfBinarryTree { 11 public static class TreeNode { 12 int val = 0; 13 TreeNode left = null; 14 TreeNode rig

二叉树的 前序 || 中序 || 后序遍历

直奔代码: 1 ///前序遍历:先遍历根节点,再遍历左子树,最后遍历右子树 2 /* 3 #include <bits/stdc++.h> 4 using namespace std; 5 6 struct tree 7 { 8 struct tree *left; 9 int date; 10 struct tree *right; 11 }; 12 typedef struct tree treenode; 13 typedef struct tree * b_tree; 14 15 b_

【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 (没思路,典型记住思路好做) 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 链接:https://www.nowcoder.com/questionTerminal/0ee054a8767c4a6c96ddab65e08688f4来源:牛客

树的三种DFS策略(前序、中序、后序)遍历

之前刷leetcode的时候,知道求排列组合都需要深度优先搜索(DFS), 那么前序.中序.后序遍历是什么鬼,一直傻傻的分不清楚.直到后来才知道,原来它们只是DFS的三种不同策略. N = Node(节点) L = Left(左节点) R = Right(右节点) 在深度优先搜索的时候,以Node的访问顺序,定义了三种不同的搜索策略: 前序遍历:结点 -> 左子树 -> 右子树 中序遍历:左子树-> 结点 -> 右子树 后序遍历:左子树 -> 右子树 -> 结点 ##前

java 二叉树的遍历 为什么只给出前序以及后序遍历,不能生成唯一的二叉树

最近在学习java的数据结构与算法知识,看到数据结构 树的遍历的方式.在理解过程中.查看到一篇文章,视野非常有深度,在信息论的角度看待这个问题.在此贴出该文章的链接以及内容. [文章出处]http://www.binarythink.net/2012/12/binary-tree-info-theory/ 我们在学习二叉树的遍历时,都会不可避免的学到二叉树的三种遍历方式,分别是遵循(根-左-右)的前序遍历.遵循(左-根-右)的中序遍历以及遵循(左-右-根)的后序遍历.并且每一个二叉树都可以用这三