题目描述
按中序遍历和后序遍历给出一棵二叉树,求这棵二叉树中叶子节点权值的最小值。
输入保证叶子节点的权值各不相同。
输入
测试数据有多组
对于每组测试数据,首先输入一个整数N (1 <= N <= 10000),代表二叉树有N个节点,接下来的一行输入这棵二叉树中序遍历的结果,最后一行输入这棵二叉树后序遍历的结果
输入一直处理到文件尾(EOF)
对于每组测试数据,首先输入一个整数N (1 <= N <= 10000),代表二叉树有N个节点,接下来的一行输入这棵二叉树中序遍历的结果,最后一行输入这棵二叉树后序遍历的结果
输入一直处理到文件尾(EOF)
输出
对于每组测试数据,输出一个整数,代表二叉树中叶子节点权值最小值
样例输入
7
3 2 1 4 5 7 6
3 1 2 5 6 7 4
8
7 8 11 3 5 16 12 18
8 3 11 7 16 18 12 5
1
255
255
样例输出
1
3
255
提示
#include<iostream>
using namespace std;
class BitreeNode
{
public:
int data;
BitreeNode *left;
BitreeNode *right;
BitreeNode()
{
left=right=NULL;
}
};
class Bitree
{
public:
BitreeNode *Root;
int * inorder;
int * pastorder;
int len;
int Min;
Bitree(int n,int *i,int *p)
{
Min=99999;
inorder=i;
pastorder=p;
len=n;
Root=makeTree(0,len-1,len-1);
}
BitreeNode *makeTree(int inleft,int inright,int root)
{
if(inright<inleft)
{
return NULL;
}
int newroot;
BitreeNode *T=new BitreeNode();
for(int i=inleft;i<=inright;i++)
{
if(inorder[i]==pastorder[root])
{
newroot=i;
break;
}
}
T->data=pastorder[root];
T->left=makeTree(inleft,newroot-1,root-1-(inright-newroot));
T->right=makeTree(newroot+1,inright,root-1);
return T;
}
void Pre(BitreeNode *p)
{
if(p!=NULL)
{
if(p->left==NULL&&p->right==NULL)
{
if(p->data<Min)
Min=p->data;
}
Pre(p->left);
Pre(p->right);
}
}
};
int main()
{
int n;
while(cin>>n)
{
int inorder[10001],pastorder[10001];
for(int i=0;i<n;i++)
cin>>inorder[i];
for(int i=0;i<n;i++)
cin>>pastorder[i];
Bitree T(n,inorder,pastorder);
T.Pre(T.Root);
cout<<T.Min<<endl;
}
return 0;
}
来源:https://www.cnblogs.com/SZU-DS-wys/p/12180845.html