leetcode:二叉樹之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.
即,根據給定的二叉樹的前序遍歷與中序遍歷,構建二叉樹
例如:一未知的二叉樹的前序遍歷爲:[1,2,3,4,5,6],其中序遍歷爲:[3,2,4,1,5,6]
由前序遍歷與中序遍歷我們可以得到二叉樹爲:
我們根據上圖可以得到其後序遍歷爲:[3,4,2,6,5,1],我們利用其後序遍歷來驗證二叉樹是否構建成功。
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 InputIterator>
TreeNode* build(InputIterator pre_first, InputIterator pre_last,InputIterator in_first, InputIterator in_last);
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
return build(begin(preorder), end(preorder),
begin(inorder), end(inorder));
}
template<typename InputIterator>
TreeNode* build(InputIterator pre_first, InputIterator pre_last,InputIterator in_first, InputIterator in_last)
{
if (pre_first == pre_last)
return NULL;
if (in_first == in_last)
return NULL;
auto root = new TreeNode(*pre_first);
auto inRootPos = find(in_first, in_last, *pre_first);
auto leftSize = distance(in_first, inRootPos);
root->left = build(next(pre_first), next(pre_first,leftSize + 1), in_first, next(in_first, leftSize));
root->right = build(next(pre_first, leftSize + 1), pre_last,next(inRootPos), in_last);
return root;
}
void postorderTraverse(TreeNode* &T)
{
if(T)//當結點不爲空的時候執行
{
postorderTraverse(T->left);//
postorderTraverse(T->right);
cout<<T->val;
}
else cout<<"";
}
int main()
{
int preorder[6]={1,2,3,4,5,6};
int inorder[6]={3,2,4,1,5,6};
vector<int>pre(preorder,preorder+6);
vector<int>in(inorder,inorder+6);
TreeNode* Tree(0);
Tree=buildTree(pre, in);
postorderTraverse(Tree);
cout<<endl;
return 0;
}
測試結果;