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

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



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