leetcode:二叉樹之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.
例如:
一未知的二叉樹的中序遍歷爲:[3,2,4,1,5,6],其後序遍歷爲:[3,4,2,6,5,1]
由中序遍歷與後序遍歷我們可以得到二叉樹爲:
我們根據上圖可以得到其前序遍歷爲:[1,2,3,4,5,6],我們利用其前序遍歷來驗證二叉樹是否構建成功。
C++實現:
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) { }
};
template<typename BidiIt>
TreeNode* buildTree(BidiIt in_first, BidiIt in_last,BidiIt post_first, BidiIt post_last);
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
{
return buildTree(begin(inorder), end(inorder),
begin(postorder), end(postorder));
}
template<typename BidiIt>
TreeNode* buildTree(BidiIt in_first, BidiIt in_last,BidiIt post_first, BidiIt post_last)
{
if (in_first ==in_last)
return NULL;
if (post_first == post_last)
return NULL;
const auto val = *prev(post_last);
TreeNode* root = new TreeNode(val);
auto in_root_pos = find(in_first, in_last, val);
auto left_size = distance(in_first, in_root_pos);
auto post_left_last = next(post_first, left_size);
root->left = buildTree(in_first, in_root_pos, post_first, post_left_last);
root->right = buildTree(next(in_root_pos), in_last, post_left_last,prev(post_last));
return root;
}
void preorderTraverse(TreeNode* &T)
{
if(T)//當結點不爲空的時候執行
{
cout<<T->val;
preorderTraverse(T->left);//
preorderTraverse(T->right);
}
else cout<<"";
}
int main()
{
int inorder[6]={3,2,4,1,5,6};
int postorder[6]={3,4,2,6,5,1};
vector<int>in(inorder,inorder+6);
vector<int>post(postorder,postorder+6);
TreeNode* Tree(0);
Tree=buildTree(in, post);
preorderTraverse(Tree);
cout<<endl;
return 0;
}
測試結果: