遍历二叉树找到最小的叶子节点。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define Max 10500
typedef struct node
{
int value;
node *left,*right;
};
node*new_node(int aim)
{
node *p=new(struct node);
p->value=aim;
p->left=p->right=NULL;
return p;
}
node *rebuild_tree(int *postor,int *inor,int len)
{
if(len==0)
return NULL;
int temp=postor[len-1];
int i;
for(i=0; i<len&&inor[i]!=temp; i++);
node *p=new_node(temp);
int left_len,right_len;
left_len=i;
right_len=len-i-1;
if(left_len)
p->left=rebuild_tree(postor,inor,left_len);
if(right_len)
p->right=rebuild_tree(postor+i,inor+1+i,right_len);
return p;
}
int find_min_value(node *root_node,int minn)
{
if(root_node)
{
if(root_node->left==NULL&&root_node->right==NULL)
if(minn>root_node->value)
{
//cout<<minn<<" "<<root_node->value<<endl;
minn=root_node->value;
return minn;
}
minn=find_min_value(root_node->left,minn);
minn=find_min_value(root_node->right,minn);
}
return minn;
}
int prin(node *roo)
{
if(roo)
{
cout<<roo->value;
prin(roo->left);
prin(roo->right);
}
else -1;
}
int main()
{
int inorder[Max],postorder[Max];
char ch;
while(scanf("%d%c",&inorder[0],&ch)!=EOF)
{
int i;
for(i=1; ch!='\n'; i++)
{
scanf("%d%c",&inorder[i],&ch);
}
// cout<<i<<endl;
for(int j=0; j<i; j++)
{
scanf("%d%c",&postorder[j],&ch);
}
// for(int j=0;j<i;j++)
// cout<<inorder[j]<<" "<<postorder[j]<<endl;
// cout<<i<<endl;
node *root=rebuild_tree(postorder,inorder,i);
int ans=find_min_value(root,99999);
cout<<ans<<endl;
// prin(root);
}
return 0;
}