《剑指offer》— JavaScript(4)重建二叉树

重建二叉树

题目描述

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


实现代码

function reConstructBinaryTree(pre, vin)
{
    if(!pre || pre.length===0){
        return;
    }

    var root={
        val:pre[0]
    };

    for(var i=0;i<pre.length;i++){
        if(vin[i]==pre[0]){
            root.left= reConstructBinaryTree(pre.slice(1,i+1),vin.slice(0,i));
            root.right= reConstructBinaryTree(pre.slice(i+1),vin.slice(i+1));
        }
    }

    return root;
}

相关知识

  二叉树是每个节点最多有两个子树的树结构。
  前序遍历:首先访问根,再先序遍历左子树,最后先序遍历右子树。
  中序遍历:首先中序遍历左子树,再访问根,最后中序遍历右子树。
  后序遍历:首先后序遍历左子树,再后序遍历右子树,最后访问根。

思路

  先序遍历第一个位置是根节点treeNode,找到中序遍历的根节点位置在中间i;

那么中序遍历i的左侧就是左字数的中序数组,右侧是右子树的中序数组

先序遍历的第二个起的

时间: 2025-01-13 06:57:32

《剑指offer》— JavaScript(4)重建二叉树的相关文章

剑指offer(4):重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 1.前序遍历的vector<int> pre中的第一个数为当前数的根节点, 在中序遍历的结果vector<int> vin中找到该数的位置 2.则左边的部分是左子树的中序遍历结果, 右边的部分是右子树中序遍历的结果, 3.再对应到前序遍历结

剑指Offer对答如流系列 - 序列化二叉树

面试题37:序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 树的结构定义如下: public class Node { int val = 0; Node left = null; Node right = null; public Node(int val) { this.val = val; } } 问题分析 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,具体的内容我们之前探讨过 剑指Offer对答如流系列 - 重建二叉树 但是采用这种方式进行序列化

剑指Offer:对称的二叉树【28】

剑指Offer:对称的二叉树[28] 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 Java题解 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution {

【剑指offer】十七,二叉树中和为某一值的路径

题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 分析:队树的节点值得求和之类的操作大部分都是基于树的遍历操作的,只要对树的遍历操作稍作变形,基本都能解决问题(个人观点).我们知道只有树的先序遍历是首先访问根节点的,此题的关键在于如何把树遍历过程中的节点保存下来,把满足条件的路径加入到结果中,不满足条件的路径节点如何进行重新的搜索.当用前序遍历的方式访问到某一节点时,我们把该节点添加到路径上,并

剑指offer系列32-----对称二叉树的判断

[题目]请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 1 package com.exe7.offer; 2 3 /** 4 * [题目]请实现一个函数,用来判断一颗二叉树是不是对称的. 5 * 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 6 * @author WGS 7 * 8 */ 9 public class SymmetricalTreeNode { 10 public class TreeNode{

剑指offer系列源码-二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. #include <iostream> #include<stdio.h> #include<vector> using namespace std; struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; }; //递归判断路劲

剑指-面试题-07.重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 限制: 0 <= 节点个数 <= 5000 解题思路 根据前序序列的第一个元素建立根结点: 在中序序列中找到该元素,确定根结点的左右子树的中序序列: 在前序序列中确定左右子树的前序序列: 由左子树的前序序

剑指offer系列源码-二叉树的镜像

输入一个二叉树,输出其镜像. 解法:交换所有非叶子结点的左右结点. #include<stdio.h> #include<iostream> using namespace std; struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; }; //树的镜像 void reseverBinaryTree(BinaryTreeNode* root){ if(root==NULL||(

《剑指Offer》题目:二叉树的镜像

题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像 题目分析:先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点.当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像. Java代码: class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x){ val = x ; } } public class MirrorBinaryTree { public void Mirror(

《剑指offer》:[60]把二叉树打印成多行

题目:从上到下安层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行. 例如,图(1)中二叉树以及打印结果为: 这个题其实很简单,我们只需要设置两个变量就可以搞定.一个变量表示当前层中还没有打印的结点数,另一个变量表示下一层结点的数目. 具体实现代码如下: #include <iostream> #include <queue> using namespace std; struct BinaryTree { int data; BinaryTree *pLeft; Bi