码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode || 105、Construct Binary Tree from Preorder and Inorder Traversal

时间:2015-04-22 11:49:15      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:二叉树   前序遍历   中序遍历   构造二叉树   dfs   

problem:

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

Hide Tags
 Tree Array Depth-first Search
题意:利用二叉树的前序遍历序列和中序遍历序列 构造二叉树,很经典的一道题

thinking:

(1)前序遍历的顺序是:父节点-> 左孩子->右孩子, 中序遍历的顺序是:左孩子->父 节点->右孩子

(2)前序遍历序列的第一个元素是父节点,在中序遍历序列中可以找到该节点的位置,利用位置之差计算出左子树的节点数,也知道右子树节点的数量了。在前序遍历序列中去掉父节点之后,第一个元素就是父节点的左孩子,前序遍历序列的右子树的第一个结点就是父节点的右孩子

(3)按照上述思路递归,可以构造出二叉树

(4)由于make()函数的形参类型是vector<int>::iterator ,太长了,这里使用模板函数,起到简化作用。 

code:

class Solution {
public:
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
        if(preorder.size()==0 || inorder.size()==0)
            return NULL;
        if(preorder.size()!=inorder.size())
            return NULL;
        return make(preorder.begin(),preorder.end(),inorder.begin(),inorder.end());

    }
private:
    template<class it>
    TreeNode *make(it pFirst,it pLast,it qFirst,it qLast)
    {
        if(pFirst==pLast)
            return NULL;
        if(qFirst==qLast)
            return NULL;
        int a=*pFirst;
        TreeNode *node= new TreeNode(a);
        it loc=find(qFirst,qLast,a);
        int left_size = loc-qFirst;
        node->left=make(pFirst+1,pFirst+left_size+1,qFirst,loc);
        node->right=make(pFirst+left_size+1,pLast,loc+1,qLast);
        return node;
    }
};


leetcode || 105、Construct Binary Tree from Preorder and Inorder Traversal

标签:二叉树   前序遍历   中序遍历   构造二叉树   dfs   

原文地址:http://blog.csdn.net/hustyangju/article/details/45190511

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!