Lintcode前序遍历和中序遍历树构造二叉树

样例

给出中序遍历:[1,2,3]和前序遍历:[2,1,3].
返回如下的树:

  2
 / 1   

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
    /**
     *@param preorder : A list of integers that preorder traversal of a tree
     *@param inorder : A list of integers that inorder traversal of a tree
     *@return : Root of a tree
     */
public:
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
        // write your code here

        int len1 = preorder.size();
        int len2 = inorder.size();
        if (len1 <= 0 || len2 <= 0) {
            return nullptr;
        }
        return  dp(preorder,inorder);

    }
    TreeNode *dp(vector<int> &porder, vector<int> &iorder) {
        int len1 = porder.size();
        int len2 = iorder.size();
        if (len1 <= 0 || len2 <= 0) {
            return nullptr;
        }

     TreeNode *root = new TreeNode();
        root->val=porder[0];
        if (len1 ==1 || len2 ==1) {
            return root;
        }
        int r=0;
        for (int i = 0; i < len1 ; ++i) {
            if (iorder[i] == root->val) {
                r = i;
                break;
            }
        }
        vector<int> linorder;
        vector<int> rinorder;
        vector<int> rporder;
        vector<int> lporder;
         for (int i = 0; i < r ; ++i) {
             linorder.push_back(iorder[i]);
         }
         for (int i = r+1; i < len2 ; ++i) {
             rinorder.push_back(iorder[i]);
         }
          for (int i = 1; i <= r ; ++i) {
             lporder.push_back(porder[i]);
         }
          for (int i = r+1; i <= len1; ++i) {
             rporder.push_back(porder[i]);
         }

         root->left =dp(lporder,linorder);
         root->right =dp(rporder,rinorder);
         return root;
    }
};

时间: 2024-07-31 02:58:14

Lintcode前序遍历和中序遍历树构造二叉树的相关文章

二叉查找树的前序遍历,后序遍历和中序遍历互求算法模板

面试的痛 前几天去阿里面试,一时忘记了二叉树的前序遍历中序遍历和后序遍历的概念,已经想死了. 然后最近去腾讯面试,被问到怎么已知前序遍历/后序遍历 + 中序遍历,求后序遍历/前序遍历,看来这种问题很喜欢考. 其实这个问题想清楚了很简单,只要把这三个概念理解透彻就可以做出来了,比如前序遍历的第一个值一定是根节点,然后这个根节点对应到中序遍历里面,在中序遍历的这个值的两边的值,一定在以此节点为根节点的两个子树上,同理,后序遍历也一样. 已知前序遍历和后序遍历是不能求唯一的中序遍历树的. #inclu

根据前序遍历和中序遍历求后序遍历

根据前序遍历和中序遍历求后序遍历 一道HULU的笔试题(How I wish yesterday once more) 假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道. PreOrder:         GDAFEMHZ InOrder:            ADEFGHMZ PostOrder:       AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是"GDAFEMHZ",而中序遍历是"AD

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

问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 在二叉树的前序遍历序列中,第一个数字总是树的根结点的值.但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边.因此我们需要扫描中序遍历序列,才能找到根结点的值. 如下图所示,

已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?

对一棵二叉树进行遍历,我们可以采取3中顺序进行遍历,分别是前序遍历.中序遍历和后序遍历.这三种方式是以访问父节点的顺序来进行命名的.假设父节点是N,左节点是L,右节点是R,那么对应的访问遍历顺序如下: 前序遍历    N->L->R 中序遍历    L->N->R 后序遍历    L->R->N /***************************************************************************************

算法基础 - 通过前序遍历和中序遍历得到后续遍历

思想 思想很简单,前序遍历,第一个节点一定是当前树的根节点,而这个节点在中序遍历中,分割了左右子树. 假如前序: root left1 left2 left3 right1 right2 中序一定是: left left left root right right 虽然left在中序的顺序不能直接通过前序得到,但是一定知道的是,在中序遍历中,root分割了左右子树.然后递归得到左右子树的遍历,就可以得到整个树了. 代码如下: #include <iostream> #include <c

二叉树的遍历规则(前序遍历、后序遍历、中序遍历)

今天看了一些关于平和查找二叉树的问题,顺便也复习了一下二叉树的遍历规则,写一下学习文档. 树的遍历顺序大体分为三种:前序遍历(先根遍历.先序遍历),中序遍历(中根遍历),后序遍历(后根遍历). 如图所示二叉树: 前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回. 前序遍历的规则: (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 这里需要注意:在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成. 前序遍历的输出结果:ABDECF 中序遍历:中序遍历可以记为左根右,也

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树

问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 在二叉树的前序遍历序列中,第一个数字总是树的根结点的值.但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边.因此我们需要扫描中序遍历序列,才能找到根结点的值. 如下图所示,

输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树

//================================================================== // <剑指Offer--名企面试官精讲典型编程题>代码 // 作者:何海涛 //================================================================== // 面试题7:重建二叉树 // 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输 // 入的前序遍历和中序遍历的结果中都

二叉树、前序遍历、中序遍历、后序遍历

一.树 在谈二叉树前先谈下树和图的概念 树:不包含回路的连通无向图(树是一种简单的非线性结构) 树有着不包含回路这个特点,所以树就被赋予了很多特性 1.一棵树中任意两个结点有且仅有唯一的一条路径连通 2.一棵树如果有n个结点,那它一定恰好有n-1条边 3.在一棵树中加一条边将会构成一个回路 4.树中有且仅有一个没有前驱的结点称为根结点 在对树进行讨论的时候将树中的每个点称为结点, 根结点:没有父结点的结点 叶结点:没有子结点的结点 内部结点:一个结点既不是根结点也不是叶结点 每个结点还有深度,比

Java:根据前序遍历与中序遍历构造出一个二叉树

给你前序遍历中序遍历,如何构造出一个二叉树? 思路: 1. 明确前序遍历与中序遍历的顺序 前序遍历:根→左子树→右子树 中序遍历:左子树→根→右子树 2. 根据前序遍历可确认根节点,在中序遍历中根节点是一个分水岭,可由根节点分辨出左右子树 3. 对左右子树分别重复第2步,可以找出左右子树的子树,也就是递归操作 代码: public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x;