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

【LeetCode】105 & 106 Construct Binary Tree from (Preorder and Inorder) || (Inorder and Postorder)Traversal

时间:2016-07-09 13:23:12      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

Description:

    Given arrays recording ‘Preorder and Inorder‘ Traversal (Problem 105) or  ‘Inorder and Postorder‘ (Problem 106), u need build the binary tree.

Input:

    105. Preorder & Inorder traversal

    106. Inorder & Postorder traversal

output:

    A binary tree.

Solution:

  This solution uses the algorithm "divide and conquer". Taking an example of 105, we can get the root node from preorder travelsal then use inorder traversal to divide the range of left tree nodes and the right tree nodes. You can

draw some simple instances on paper,  which will make you totally clear about the thinking. 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
//105
class Solution {
public:
    void travel(TreeNode **root)
    {
        if(*root){
            travel(& ((*root) -> left));
            cout<<"val is "<<(*root)->val<<endl;
            travel(& ((*root) -> right));
        }
    }

    TreeNode* createTree(vector<int>& preorder, vector<int>& inorder, int preSta, int preEnd, int inSta, int inEnd)
    {
        if(preSta > preEnd || inSta > inEnd ) return NULL;
        TreeNode *root = new TreeNode(preorder[preSta]);
        int index;
        for(int i = inSta; i <= inEnd; i ++){
            if(inorder[i] == preorder[preSta]){
                index = i;
                break;
            }
        }
        root -> left = createTree(preorder, inorder, preSta + 1, preSta + index - inSta, inSta, index - 1);
        root -> right = createTree(preorder, inorder, preSta + index - inSta + 1, preEnd, index + 1, inEnd);
        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        TreeNode *root = createTree(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
        TreeNode **r = &root;
        //travel(r);
        return root;
    }
};

//106.
class Solution {
public:
    TreeNode* createTree(vector<int>& inorder, vector<int>& postorder, int inSta, int inEnd, int postSta, int postEnd){
        if(inSta > inEnd || postSta > postEnd)
            return NULL;
        TreeNode* root = new TreeNode(postorder[postEnd]);
        int index;
        for(int i = inEnd; i >= inSta; i --){
            if(postorder[postEnd] == inorder[i]){
                index = i;
                break;
            }
        }
        root -> right = createTree(inorder, postorder, index + 1, inEnd, postEnd - (inEnd - index), postEnd - 1);
        root -> left = createTree(inorder, postorder, inSta, index - 1, postSta, postSta + (index - inSta - 1));
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        TreeNode* root = createTree(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1);
        return root;
    }
};

 

【LeetCode】105 & 106 Construct Binary Tree from (Preorder and Inorder) || (Inorder and Postorder)Traversal

标签:

原文地址:http://www.cnblogs.com/luntai/p/5655571.html

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