106. Construct Binary Tree from Inorder and Postorder Traversal

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

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

分析:

首先要弄清楚什麼是後序遍歷和中序遍歷?
前序遍歷,先遍歷當前的節點,然後遍歷該節點的左分支(即遍歷左分支的所有節點),最後再遍歷該節點的右分支。

中序遍歷,先遍歷當前節點的左分支,再遍歷當前節點,最後遍歷當前節點的右分支。
後序遍歷,就是先左分支,再右分支,最後當前節點。

以下面的二叉樹爲例。
         4
        / \
      2    7
     /  \  /  \
    1  3 6   9
其後序遍歷結果:【1 3 2 6 9 7 4】
中序遍歷結果是:【1 2 3 4 6 7 9】


對後序遍歷來說:
後序遍歷的末尾結點都是前面的若干個結點(根據中序遍歷即可確定)的父結點。
比如【4】是這個二叉樹的根結點,【2】是【1 3】的父結點,【7】是【4 6】的父結點,


對中序遍歷來說:
根結點(根據後序遍歷即可得)一定在中間位置,該位置左邊是其左子樹,右邊是其右子樹。
比如【4】左邊【1 2 3】全是根結點的左子樹,右邊是【6 7 9】是根結點的右子樹。
對於【2】來說,【1】是其左子樹,【3】是其右子樹。
……
依次類推。
很明顯,這是一個遞歸過程。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(postorder.size()==0 || postorder.size()!=inorder.size())  
            return NULL;  
        return helpBuild(postorder, 0, postorder.size()-1, inorder, 0, inorder.size()-1); 
    }
    TreeNode* helpBuild(  
        vector<int> &postorder, int beginp, int endp,   
        vector<int> &inorder, int beginord, int endord)  
    {  
        if(beginp > endp)  
            return NULL;  
        else if(beginp == endp)  
            return new TreeNode(postorder[endp]);      
        TreeNode* root = new TreeNode(postorder[endp]);   
        int i = beginord;  
        for(; i <= endord; i ++)  
        {  
            if(inorder[i] == postorder[endp])  
                break;  
        }   
        
        int leftlen = i-beginord;  
          
        root->left = helpBuild(postorder, beginp, beginp+leftlen-1, inorder, beginord, beginord+leftlen-1);  
        root->right = helpBuild(postorder, beginp+leftlen, endp-1, inorder, beginord+leftlen+1, endord);  
        return root;  
    }  
};

注:本博文爲EbowTang原創,後續可能繼續更新本文。如果轉載,請務必複製本條信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51582189
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode題解索引:http://blog.csdn.net/ebowtang/article/details/50668895
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章