算法之重建二叉树

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

 //m,n 前序数组的起点和终点 i,j 中序数组的起点和终点
TreeNode * ConstructSub(vector<int>&preOrderVec,vector<int>&inOrderVec,int m,int n,int i,int j){
    int rootValue = preOrderVec[m];
    TreeNode * root = new TreeNode(rootValue);
    root->left=nullptr;
    root->right=nullptr;

    //边界, 左边或者右边只有一个元素的时候,并且前序和中序的值相等
    if(m==n && i==j){
        if(preOrderVec[m]==inOrderVec[i]){
            return root;
        }
        else{return nullptr;}
    }

    //找到左右两边
    //中序序列里的root的索引
    int rootInorderIndex=i;
    //往后开始找
    while (rootInorderIndex<n&&inOrderVec[rootInorderIndex]!=rootValue) {
        rootInorderIndex++;
    }
    //找到了,那就划分左右子树,然后递归
    int leftLength= rootInorderIndex-i;
    int leftPreorderEndIndex= m+leftLength;
    //存在左子树
    if(leftLength>0){
        root->left = ConstructSub(preOrderVec, inOrderVec, m+1, leftPreorderEndIndex,i,rootInorderIndex-1);
    }
    //存在右子树
    if(leftLength<n-m){
        root->right= ConstructSub(preOrderVec, inOrderVec, leftPreorderEndIndex+1, n, rootInorderIndex+1, j);
    }
    return root;
}

原文地址:https://www.cnblogs.com/xiaonanxia/p/10522188.html

时间: 2024-10-14 00:46:14

算法之重建二叉树的相关文章

【数据结构与算法】重建二叉树

只能根据前序中序或者中序后序重建二叉树,不可能根据前序和后序重建,因为需要中序去划分左右子树. 代码实现 /** * 源码名称:ConstructBT.java * 日期:2014-09-05 * 程序功能:重建二叉树(前序中序) * 版权:[email protected] * 作者:A2BGeek */ public class ConstructBT { class Node<T> { T mValue; Node<T> mLeft; Node<T> mRight

[算法题] 重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 题目思路 本题就是按照建立二叉树的思路建立就行了.先序遍历的第一个是根节点,然后在中序遍历找到该根节点,以此为界,中序遍历的左边是它的左子树的中序遍历,同样地找到该左子树在先序遍历中对应的先序遍历顺序.对于右子树也是一样的方法. 本体采用递归,递归就要先写出终止条件. Python代码 这个题目用Python非常方便,因为可以直接利用到Python中的切片技术,省时省力通俗

笔试算法题(36):寻找一棵二叉树中最远节点的距离 &amp; 根据二叉树的前序和后序遍历重建二叉树

出题:求二叉树中距离最远的两个节点之间的距离,此处的距离定义为节点之间相隔的边数: 分析: 最远距离maxDis可能并不经过树的root节点,而树中的每一个节点都可能成为最远距离经过的子树的根节点:所以计算出以每个节点为根节点的子树的最 远距离,最后取他们的最大值就是整棵树的最远距离: 如果递归层次过多造成系统栈溢出,则可以使用stack堆栈结构存储递归节点,从而使用循环实现 解题: 1 struct Node { 2 int value; 3 Node *left; 4 Node *right

牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端

   总结:    重建二叉树:其实就是根据前序和中序重建得到二叉树,得到后续,只要输出那边设置输出顺序即可 [编程题]重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 完整通过代码: 先新建一个二叉树的类 public class TreeNode { int val; TreeNode left

二叉树(14)----由前序遍历和中序遍历重建二叉树

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 二.根据前序遍历序列和中序遍历序列重建二叉树 算法说明: 由中序遍历序

重建二叉树-牛客网-剑指offer

1.问题描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 2.问题分析 2.1首先了解二叉树的结构 2.2了解二叉树的三种遍历顺序(前序遍历,中序遍历和后序遍历) 前序遍历:中左右 中序遍历:左中右 后序遍历:左右中 根据前序遍历序列和中序遍历序列,或后序遍历序列和中序遍历序列,能唯一确定二叉树. 2.3

二叉树(15)----由中序遍历和后序遍历重建二叉树,递归方式

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.由中序遍历和后序遍历重建二叉树 中序遍历中,根节点总是位于左右子树

剑指offer[4]——重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 先序遍历是按照中--左--右的方式对二叉树进行遍历,由这种遍历方式我们可以很容易理解现需遍历的第一个数字是根节点的值. 比如说这个二叉树的线序遍历就是1-2-4-7-3-5-6-8,第一个数字就是根节点的值. 而中序遍历,顾名思义,就是按照左--中--

第3章 结构之法——重建二叉树

重建二叉树 问题描述 分析与解法 用java实现的代码如下: 1 package chapter3jiegouzhifa.RebuildBinTree; 2 3 /** 4 * 重建二叉树 5 * 递归解法 6 * @author DELL 7 * 8 */ 9 public class RebuildBinTree { 10 //定义节点类 11 public static class Node{ 12 int left; //左子树位置 13 int right; //右子树位置 14 ch