【oj刷题记】【考研写法】【1270】【还原二叉树III】【只知道前序遍历构造二叉搜索树】【利用二叉搜索树的性质】

【oj刷题记】【考研写法】【1270】【还原二叉树III】【只知道前序遍历构造二叉搜索树】【利用二叉搜索树的性质】_第1张图片

 

一个性质:

 二叉搜索树的 前序序列 通过 排序 就是 中序序列

/*
之前知道,构造二叉搜索树需要:前序+中序 / 后序+中序 
观察本题是一棵二叉搜索树,
把二叉搜索树的先序序列经过从小到大排序就是中序变遍历了 
*/

#include 
using namespace std;
const int N=110;
int n;
int preorder[N],inorder[N];

struct Node
{
	int key;
	Node *l,*r;
	Node(){}
	Node(int key):key(key),l(NULL),r(NULL){}
};



Node *build(int pl,int pr,int il,int ir)
{
	if(pl>pr) return NULL;
	
	Node *root=new Node(preorder[pl]);
	int k=il;
	while(inorder[k]!=root->key)
	{
		k++;
	}
	
	
	root->l=build(pl+1,pr-ir+k,il,k-1);
	root->r=build(pr-ir+k+1,pr,k+1,ir);
	
	
	return root;
}

void post_order_traverse(Node *root)
{
	if(root==NULL) 
	{
		return;
	}
	
	if(root->l) post_order_traverse(root->l);
	if(root->r) post_order_traverse(root->r);
	
	cout<key<<" ";
}


int main()
{
	cin>>n;
	for(int i=0;i>preorder[i];
		inorder[i]=preorder[i];
	}
		
	sort(inorder,inorder+n);
	
	Node *root=build(0,n-1,0,n-1);
	post_order_traverse(root);
	
	return 0;
}

 

 

你可能感兴趣的:(oj刷题记,考研写法,数据结构)