LintCode-剑指Offer-(73)前序遍历和中序遍历树构造二叉树

原创 2015年11月21日 17:05:29
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:
    //获取一个元素在vector中的下标
    int getLoc(vector<int >& ino, int ele){
        for ( int i = 0; i < ino.size( ); i++ ){
            if ( ino[i] == ele ){
                return i;
            }
        }
        return -1;
    }
    //是否在左边子树中
    bool IsInChildLeftTree(int ele, int s, int e, vector<int> v){
        for ( int i = s; i < e; i++ ){
            if ( ele == v[i] )
                return true;
        }
        return false;
    }
public:

    //找到右子树的根节点
    //s:中序遍历中左子树的起点
    //incurpos:当前子树根节点在中序遍历的位置,是查找的终点
    //precurpos:当前子树根节点在前序遍历的位置 ,也是左子树的终点
    int findRightRoot(vector<int> pre, vector<int> ino, int s, int precurpos, int incurpos)
    {
        int i = precurpos + 1; //当前根的起点,是在前序遍历中的
        while ( i < pre.size( ) && IsInChildLeftTree(pre[i], s, incurpos, ino) == true ){  //如果处于左子树中,下标增加
            i++;
        }
        if ( i >= pre.size( ) )return -1;
        return i;
    }
    //s:子树起点
    //e:子树终点,这两个都是指在中序遍历中的位置
    //precurpos:当前子树根节点的在前序遍历中的位置
    //incurpos:当前子树根节点在中序遍历的位置
    //node:传入的根节点
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
        // write your code here
        TreeNode* root = NULL;
        if ( preorder.size( ) == 0 )
            return NULL;
        buildTree(preorder, inorder, 0, preorder.size( ), 0, getLoc(inorder, preorder[0]), root);
        return root;
    }

     //s,e指定了区间长度
    //precurpos:当前根在前序遍历中的位置
    //incurpos:当前根在中序遍历中的位置
    void buildTree(vector<int> &preorder, vector<int> &inorder, int s, int e, int precurpos, int incurpos, TreeNode*& node) {
        static int* inblocked = new int[preorder.size( )];  //保存当前已经构造完毕的节点
        if ( s >= e || precurpos > preorder.size( ) || incurpos > preorder.size( ) || e > preorder.size( ) ){
            node = NULL;
            return;
        }
        node = new TreeNode(preorder[precurpos]);//当前节点已经构造,不用再次构造
        int currentblockloc = getLoc(inorder, preorder[precurpos]);
        inblocked[currentblockloc] = 1;//所以不用再次构造,blocked=1
        //cout << "constructing node:" << node->val << endl;   
        //从先序遍历中找到右边子节点
        int tmprightcur = findRightRoot(preorder, inorder, s, precurpos, incurpos);
        int ttt; //找到当前节点在中序遍历中的位置,这个位置可以将中序遍历的序列分为左边和右边
        ttt= getLoc(inorder, preorder[precurpos]);
        //cout << "start from:" << s << "end with:" << ttt << endl;
        //如果当前左边已经到边界,或者已经有值,那么左边不用处理
        if ( !( currentblockloc < 0 || (currentblockloc>0&& inblocked[currentblockloc - 1] == 1 ) ) && precurpos + 1<preorder.size() )
            buildTree(preorder, inorder, s, ttt, precurpos + 1, getLoc(inorder, preorder[precurpos + 1]), node->left);
        //cout << "start from:" << ttt << "end with:" << tmprightcur << endl;
        //如果当前右边已经到了边界,或者已经有值,那么右边不用处理
        if ( !( currentblockloc >= preorder.size() || (currentblockloc<preorder.size()-1&& inblocked[currentblockloc + 1] == 1)&&tmprightcur!=-1 )
            && tmprightcur<preorder.size() )
            buildTree(preorder, inorder, ttt,e, tmprightcur,getLoc(inorder,preorder[tmprightcur]), node->right);
    }
    void DisplayTree(TreeNode* root){
        if ( root == NULL )
            return;
        cout << root->val << endl;
        DisplayTree(root->left);
        DisplayTree(root->right);
    }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

lintcode- 前序遍历和中序遍历树构造二叉树-73

/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left,...
  • ljlstart
  • ljlstart
  • 2015年10月19日 01:00
  • 678

LeetCode --- 73. Set Matrix Zeroes

题目链接:Set Matrix Zeroes Given a m x n matrix, if an element is 0, set its entire row and column to 0...
  • makuiyu
  • makuiyu
  • 2015年03月20日 21:50
  • 1445

剑指offer--重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5...
  • kangaroo835127729
  • kangaroo835127729
  • 2015年04月10日 22:57
  • 1983

剑指Offer(第二版)面试题7:重建二叉树

根据前序遍历序列和中序遍历序列,如何重建二叉树
  • qq_25827845
  • qq_25827845
  • 2017年05月11日 20:03
  • 768

剑指offer——二叉树的下一个节点

题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:根据中序遍历的特点,要找到一个节点的下一个节点无非...
  • sbq63683210
  • sbq63683210
  • 2016年07月06日 15:34
  • 1118

Java笔记---剑指Offer(一:Java实现重建二叉树)

一、前言 最近正在准备找实习,因此拿起《剑指Offer》来看看,突击下自己的基础。但是《剑指Offer》上面的算法都是使用C语言,个人对C语言不熟悉,因此使用自己熟悉的Java来实现。嗯,以后要是机试...
  • GuLu_GuLu_jp
  • GuLu_GuLu_jp
  • 2016年03月09日 11:15
  • 964

【剑指offer】二叉树深度

题目描述: 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 输入: 第一行输入有n,n表示结点数,结点号从1到n。根结点为1。...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月28日 08:22
  • 3112

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

题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 输入: 每个测试案例包括n+1行: 第一行为2...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月19日 08:18
  • 4161

剑指Offer--023-从上往下打印二叉树(层次遍历二叉树)

链接 牛客OJ:从上往下打印二叉树 九度OJ:http://ac.jobdu.com/problem.php?pid=1523 GitHub代码: 023-从上往下打印二叉树 ...
  • gatieme
  • gatieme
  • 2016年04月20日 23:36
  • 1796

剑指Offer——编程题的Java实现

声明:我写这个的意图是我在看书的过程中,就我掌握的
  • google19890102
  • google19890102
  • 2014年10月23日 20:06
  • 12954
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LintCode-剑指Offer-(73)前序遍历和中序遍历树构造二叉树
举报原因:
原因补充:

(最多只允许输入30个字)