【数据结构】根据二叉树的中后序(前中序)遍历构建二叉树及求最小权值叶子节点

本文介绍了如何根据给定的前序遍历和中序遍历构造二叉树,并实现查找最小叶子节点的函数。通过递归方法实现了二叉树的创建以及中后序遍历的调用。
摘要由CSDN通过智能技术生成
#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;
}
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值