#include<iostream>
using namespace std;
#define MAX 65335
//AC:二叉树的中后序遍历构建及求叶子
struct Node{
int data;
Node *left,*right;
Node():data(0),left(NULL),right(NULL){}
Node(int d):data(d),left(NULL),right(NULL){}
};
//根据前序和中序构造二叉树
// void CreateTree(Node* &root,int *str1,int *str2,int n){//中序 前序
// if(n==0) return;
// root=new Node(str2[0]);//前序序列的第一个元素为根元素
// //找到中序序列中根节点的位置
// int pos;
// for(int i=0;i<n;i++){
// if(str1[i]==str2[0]){
// pos=i;break;
// }
// }
// //递归构造
// CreateTree(root->left,str1,str2+1,pos);//看str1的左半边
// CreateTree(root->right,str1+pos+1,str2+pos+1,n-pos-1);//看str1的右半边
// }
// 根据中序和后序构造二叉树
void CreateTree(Node* &root,int *str1,int *str2,int n){//中序 后序
if(n==0) return;
root=new Node(str2[n-1]);//后序序列最后一个元素为根元素
//找到中序序列中根节点的位置
int pos;
for(int i=0;i<n;i++){
if(str1[i]==str2[n-1]){
pos=i;break;
}
}
//递归构造
CreateTree(root->left,str1,str2,pos);//看str1的左半边
CreateTree(root->right,str1+pos+1,str2+pos,n-pos-1);//看str1的右半边
}
void FindMinLeaf(Node *root,int &minleaf){
if(root==NULL) return ;
else if(root->left==NULL&&root->right==NULL){
if(root->data<minleaf) minleaf=root->data;
}
else{
FindMinLeaf(root->left,minleaf);
FindMinLeaf(root->right,minleaf);
}
}
void PreOrder(Node *root){
if(root==NULL) return;
cout<<root->data<<" ";
PreOrder(root->left);
PreOrder(root->right);
}
void PostOrder(Node *root){
if(root==NULL) return;
PostOrder(root->left);
PostOrder(root->right);
cout<<root->data<<" ";
}
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;//二叉树的节点数
Node *root=NULL;
int *str1=new int[n];
int *str2=new int[n];
for(int i=0;i<n;i++){
cin>>str1[i];
}
for(int i=0;i<n;i++){//前序or后序
cin>>str2[i];
}
CreateTree(root,str1,str2,n);
// 检验构造是否成功
// PostOrder(root);
// PreOrder(root);
int min=MAX;
FindMinLeaf(root,min);
cout<<min<<endl;
}
// system("pause");
return 0;
}
【数据结构】根据二叉树的中后序(前中序)遍历构建二叉树及求最小权值叶子节点
于 2024-01-04 11:00:30 首次发布
本文介绍了如何根据给定的前序遍历和中序遍历构造二叉树,并实现查找最小叶子节点的函数。通过递归方法实现了二叉树的创建以及中后序遍历的调用。
摘要由CSDN通过智能技术生成