[LeetCode_105]Construct Binary Tree from Preorder and Inorder Traversal

题目链接

https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

题意

由二叉树的先序遍历和中序遍历建树

思路

理解建树过程;使用递归,递归关键:清楚递归过程,明确函数参数、返回值,写终止条件。
此外,注意空树的特判。

其他点

1 熟悉find()、assign()的使用。
2 使用

struct TreeNode *pNode =new TreeNode(*preRootIter);

而不是

struct TreeNode node=TreeNode(*preRootIter);
struct TreeNode* pNode=node;

否则造成assign的时候树中某些节点值被改变。

todo

上述问题原因待查。
应该最后要遍历树释放内存吧。

代码

#include <vector>
#include <iostream>
using namespace std;

 struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(!preorder.size()){
            return NULL;
        }
        else{
            struct TreeNode* root=buildT(preorder,inorder);
            return root;
        }
    }
    
private:
    TreeNode* buildT(vector<int> preorder,vector<int> inorder){
        vector<int>::iterator preRootIter=preorder.begin();
        vector<int>::iterator midRootIter=find(inorder.begin(), inorder.end(), *preRootIter);
        //create a new node
        struct TreeNode *pNode =new TreeNode(*preRootIter);
//        struct TreeNode node=TreeNode(*preRootIter);
//        struct TreeNode* pNode=node;
        
        //left child tree
        vector<int>::size_type leftLen=midRootIter-inorder.begin();
        vector<int>::iterator lPreBeg=preRootIter+1;
        vector<int>::iterator lPreEnd=lPreBeg+leftLen;
        if(!leftLen){
            pNode->left=NULL;
        }
        else{
            vector<int> preorderLeft;
            preorderLeft.assign(lPreBeg, lPreEnd);
            
            vector<int> inorderLeft;
            inorderLeft.assign(inorder.begin(), midRootIter);
            pNode->left=buildT(preorderLeft, inorderLeft);
        }
        
        //right child tree
        vector<int>::size_type rightLen=inorder.end()-(midRootIter+1);
        if(!rightLen){
            pNode->right=NULL;
        }
        else{
            vector<int> preorderRight;
            vector<int>::iterator rPreBeg=lPreEnd;
            vector<int>::iterator rPreEnd=rPreBeg+rightLen;
            preorderRight.assign(rPreBeg, rPreEnd);
            
            vector<int> inorderRight;
            inorderRight.assign(midRootIter+1, inorder.end());
            pNode->right=buildT(preorderRight, inorderRight);
        }

        return pNode;
    }
};

int main(){
    Solution solution;
    vector<int> preorder={3,9,20,15,7};
    vector<int> inorder={9,3,15,20,7};
    struct TreeNode* tree=solution.buildTree(preorder,inorder);
    return 0;
}

posted on 2019-01-22 12:08  coding_gaga  阅读(144)  评论(0编辑  收藏  举报

导航