105. Construct Binary Tree from Preorder and Inorder Traversal

Given preorder and inorder 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
其先序遍歷結果:【4 2 1 3 7 6 9】
中序遍歷結果是:【1 2 3 4 6 7 9】


對先序遍歷來說:
先序遍歷的每個值表示的結點都是接下來的若干個結點(根據中序遍歷即確定)的父結點。
比如【4】是這個二叉樹的根結點,【2】是【1 3】的父結點,【1】是 空的父結點,也即使葉子結點。


對中序遍歷來說:
根結點(根據前序遍歷即確定)一定在中間位置,該位置左邊是其左子樹,右邊是其右子樹。
比如【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>& preorder, vector<int>& inorder) {
        if(preorder.size()==0 || preorder.size()!=inorder.size())
            return NULL;
        return helpBuild(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);    
    }
    
    TreeNode* helpBuild(
        vector<int> &preorder, int beginpre, int endpre, 
        vector<int> &inorder, int beginord, int endord)
    {
        if(beginpre > endpre)
            return NULL;
        else if(beginpre == endpre)
            return new TreeNode(preorder[beginpre]);    
        TreeNode* root = new TreeNode(preorder[beginpre]); 
        int i = beginord;
        for(; i <= endord; i ++)
        {
            if(inorder[i] == preorder[beginpre])
                break;
        } 
        //inorder[i]此時就是根
        int leftlen = i-beginord;
        
        //preorder[beginpre]是根
        root->left = helpBuild(preorder, beginpre+1, beginpre+leftlen, inorder, beginord, beginord+leftlen-1);
        root->right = helpBuild(preorder, beginpre+leftlen+1, endpre, inorder, beginord+leftlen+1, endord);
        return root;
    }
};


注:本博文爲EbowTang原創,後續可能繼續更新本文。如果轉載,請務必複製本條信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51580867
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode題解索引:http://blog.csdn.net/ebowtang/article/details/50668895

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章