leetcode:二叉樹之Construct Binary Tree from Preorder and Inorder Traversal

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;
}
測試結果;




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