根据中序和前序遍历还原二叉树

思路就是从前序遍历出发,到中序遍历中找到相应的根节点,然后确定左子树和右子树的范围

struct BiNode
{
    int value;
    BiNode *leftchild;
    BiNode *rightchild;
};

class solution
{
public:
     BiNode* BiTree(int *preorder,int *midorder,int length)
    {
        if(length < 0 || preorder == nullptr || midorder == nullptr)
            return nullptr;
        return constructTree(preorder,preorder+length,midorder,midorder+length);
    }
    BiNode* constructTree(int* pre,int* pre_end,int* mid,int* mid_end)
    {
        int rootValue = pre[0];
        BiNode* root = new BiNode();
        root->value = rootValue;
        root->leftchild = nullptr;
        root->rightchild = nullptr;

        if(pre == pre_end) //×ó×ÓÊ÷½áÊø
        {
            if(mid == mid_end && mid == pre)
                return root;
            else
                throw std::exception("Invalid input.")
        }
        int* root_index = mid;

        while( root_index <=mid_end &&*root_index != rootValue)
            root_index++;

        int left_length = root_index - mid;
        int* left_end = pre + left_length;
        if(left_length > 0)
        {
            root->leftchild = constructTree(pre+1,pre_end,mid,root_index-1);
            root->rightchild = constructTree(pre+1,pre_end,root_index+1,mid_end);

        }
        return root;
    }
};

最近开学,都没有什么时间继续学习这方面的东西了,o(╥﹏╥)o

原文地址:https://www.cnblogs.com/jianbo1995/p/9581644.html

时间: 2024-08-05 10:47:59

根据中序和前序遍历还原二叉树的相关文章

【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal-通过中序和后续遍历还原二叉树

一.描述: 二.思路: 二叉树的中序遍历和前序遍历或和后续遍历能唯一确定一节课二叉树,即2中还原方式都需要中序遍历才能完成: 设二叉树的前序遍历序列为{1, 2, 4, 5, 3, 6},中序遍历序列为{4,2,5,1, 3, 6}:(红色标记表示以还原节点!!!) (1)-前序遍历的第一个节点是二叉树的根节点,{1, 2, 4, 5, 3, 6},对应中序中的位置是{4,2,5,1, 3, 6},所以中序序列中的 '1' 之前的全部元素为左子树元素,'1'之后的为右子树元素: (2)-左子树对

Binary Tree Inorder/Preorder Traversal 返回中序和前序/遍历二叉树的元素集合

给定一个二叉树,以集合方式返回其中序/先序方式遍历的所有元素. 有两种方法,一种是经典的中序/先序方式的经典递归方式,另一种可以结合栈来实现非递归 Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. OJ's Binary Tree Serialization: The ser

[Leetcode] Construct binary tree from inorder and postorder travesal 利用中序和后续遍历构造二叉树

Given inorder and postorder traversal of a tree, construct the binary tree. Note:  You may assume that duplicates do not exist in the tree. 利用中序和后序遍历构造二叉树,要注意到后序遍历的最后一个元素是二叉树的根节点,而中序遍历中,根节点前面为左子树节点后面为右子树的节点.例如二叉树:{1,2,3,4,5,6,#}的后序遍历为4->5->2->6-&

如何根据前序、中序、后序遍历还原二叉树(转)

原文:https://blog.csdn.net/yanerhao/article/details/45175943 面试题目或多或少会出现这样的选择题或者简答题: 首先我们得知道概念: 前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树.对于二叉树,深度遍历与此同.规律:根在前:子树在根后且左子树比右子树靠前,且第一个就是根节点: 中序遍历:先访问当前节点的左子树,然后访问当前节点,最后是当前节点的右子树,二叉树,中序遍历会得到数据升序效果.规律:根在中:左子树在跟左边

根据先序、中序、后序遍历还原二叉树

遍历方式的转至二叉树的四种遍历方式 首先我们要知道三种遍历方式的规律: 先序遍历:跟在前,子树的根在后,左子树比右子树考前,且第一个就是根节点. 中序遍历:左子树在根左边,右子树在根右边,左边的部分是根节点的左子树的中序遍 历序列,右边部分是根节点右子树的中序遍历序列. 后序遍历:根在后,子树在根前且左子树比右子树靠前,且最后一个节点是根节点. 一.先序+中序 根据先序序列的第一个元素建立根节点 在中序序列中找到该元素,确定根节点的左右子树的中序序列 在先序序列中确定左右子树的先序序列 由左子树

【Tree】已知前序和中序遍历还原二叉树

1 /************************** 2 https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 3 @date 2015.5.16 4 @description 5 根据前序和中序遍历,重构二叉树 6 可用迭代,也可以使用递归. 7 递归前面已经写过,耗时,这里再次做使用迭代. 8 9 @tags tree, array, depth-first se

根据中序和前序序列来构造二叉树,以宽度优先遍历输出

/** * 重建二叉树 :根据给定的前序和中序遍历的结果,构造出树的结构 */ package binaryBree; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; /** * @author Amory.Wang * Question : 重建二叉树 * test example : 普通二叉树 , 特殊二叉树(只有右结点或者只有左结点) ,特殊输入测试 : root=null/输入

UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后输出来叶子节点. 一开始写的时候是用gets读入的,报CE, 要用fgets写,关于fgets(),传送门: fgets函数及其用法,C语言fgets函数详解 一开始用bfs过的,后来发现,好多人都是dfs过的,又写了一下dfs... 代码: 1 //二叉树的中序和后序遍历还原树并输出最短路径的叶子

二叉树遍历,深度有限遍历,广度优先遍历,前序中序后续优先遍历,层次遍历

首先明白两个概念: 1. 深度遍历包括前中后序遍历三种: 2. 广度优先遍历就是层次遍历. PS: 前中后序遍历,如果使用递归遍历,都很简单易理解: 如果使用非递归方式,首先想到的就应该是使用栈结构来控制整个过程,因为递归也是利用栈来实现的: 前中后序遍历的非递归方式中,后序遍历的非递归方式相比较而言,略复杂. 直接上代码: #include "stdlib.h" #include <iostream> #include <stack> #include <