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;
}
};
原文地址:http://blog.csdn.net/ebowtang/article/details/51580867
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode題解索引:http://blog.csdn.net/ebowtang/article/details/50668895