二叉树的中后序遍历构建及求叶子

简介: 二叉树的中后序遍历构建及求叶子
题目描述
按中序遍历和后序遍历给出一棵二叉树,求这棵二叉树中叶子节点权值的最小值。
输入保证叶子节点的权值各不相同。
输入
第一行输入一个整数t,表示有t组测试数据。
对于每组测试数据,首先输入一个整数N (1 <= N <= 10000),代表二叉树有N个节点,接下来的一行输入这棵二叉树中序遍历的结果,最后一行输入这棵二叉树后序遍历的结果。
输出
对于每组测试数据,输出一个整数,代表二叉树中叶子节点权值最小值。
样例输入
3
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

解题关键:

先明确,我们建树一般是通过前序遍历的顺序建的。

前序遍历: 根–>左孩子 --> 右孩子

中序遍历: 左孩子–>根 --> 右孩子

后序遍历: 左孩子 --> 右孩子–>根

所以,当我们已知中序遍历以及后序遍历的结果时,我们就可以通过找出一定的规律解题,比如后序遍历的结果的最后一个元素一定是根节点。

如图:

我们发现,在中序遍历结果中,根节点的左边元素为左子树,右元素是右子树。故可以递归得出最后的建树结果。

附:例题C++代码

#include<iostream>
#include<algorithm>
using namespace std;
int *m;
int *h;
int len;
int ans;
class BiTreeNode{
  public:
    int data;
    BiTreeNode *lChild;
    BiTreeNode *rChild;
    BiTreeNode():lChild(NULL),rChild(NULL){};
    ~BiTreeNode(){};
};
class BiTree{
  private:
    BiTreeNode *root;
    BiTreeNode * createBiTree(int *mid, int *last, int n);
    void getMin(BiTreeNode *t);
  public:
    BiTree(){};
    ~BiTree(){};
    void createTree(); 
    void getMin();
};
void BiTree::createTree(){
  root = createBiTree(m,h,len);
}
BiTreeNode* BiTree::createBiTree(int *mid, int *last, int n){
    if(n==0){
        return NULL;
    }
    BiTreeNode* T = new BiTreeNode();
    int i;
    T->data = last[n-1];
    for(i=0; mid[i]!=last[n-1]; i++);
    T->lChild = createBiTree(mid,last,i);
    T->rChild = createBiTree(mid+i+1,last+i, n-i-1);
  return T;
}
void BiTree::getMin(){
  getMin(root);
}
void BiTree::getMin(BiTreeNode *t){ 
    if(t){
        if(!t->lChild && !t->rChild){
            ans = min(ans,t->data);
        }
        getMin(t->lChild);
        getMin(t->rChild);
    }
}
int main(){
  int Nt;
  cin >> Nt;
  while(Nt--){
        ans = 99999999;
        cin>>len;
        m = new int[len];
        h = new int[len];
        for(int i=0; i<len; i++){
            cin>>m[i]; 
        }
        for(int i=0; i<len; i++){
            cin>>h[i];
        } 
        BiTree *bt = new BiTree();
        bt->createTree();
        bt->getMin();
        cout<<ans<<endl;
  }
  return 0;
}
相关文章
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
网络协议 Unix 网络架构
网际控制报文协议ICMP
网际控制报文协议(ICMP)是TCP/IP体系结构中网际层的关键组件,用于提高IP数据报的成功传输率。ICMP主要处理两类报文:差错报告报文与询问报文。前者包括终点不可达、源点抑制、时间超过、参数问题及重定向等五类;后者则涵盖回送请求/回答及时间戳请求/回答。ICMP广泛应用于检测网络连通性的PING工具和追踪数据包路径的traceroute工具中。两者分别利用ICMP的回送请求报文及差错报告报文实现功能。
509 10
串应用- 计算一个串的最长的真前后缀
这篇文章提供了一个C++程序,用于找出给定字符串的最长真前后缀,并展示了如何通过计算每个子串的最长相同前后缀来实现这一功能。
|
缓存 算法 计算机视觉
OpenCV图像处理-视频分割静态背景-MOG/MOG2/GMG
1.概念介绍 视频背景扣除原理:视频是一组连续的帧(一幅幅图组成),帧与帧之间关系密切(GOP/group of picture),在GOP中,背景几乎是不变的,变的永远是前景。
661 0
问题 B: DS哈希查找—二次探测再散列(关键字互不相同
问题 B: DS哈希查找—二次探测再散列(关键字互不相同
193 0
|
机器学习/深度学习 算法 数据挖掘
【Python 机器学习专栏】Python 中的线性回归模型详解
【4月更文挑战第30天】本文介绍了Python中的线性回归模型,包括基本原理、实现步骤和应用。线性回归假设因变量与自变量间存在线性关系,通过建立数学模型进行预测。实现过程涉及数据准备、模型构建、参数估计、评估和预测。常用的Python库有Scikit-learn和Statsmodels。线性回归简单易懂,广泛应用,但对异常值敏感且假设线性关系。其扩展形式如多元线性、多项式回归和正则化方法能适应不同场景。理解并运用线性回归有助于数据分析和预测。
795 0
|
算法 搜索推荐
经典算法之折半插入排序(Binary Insertion Sort)
经典算法之折半插入排序(Binary Insertion Sort)
485 0
|
算法 Java
数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!
数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!
5742 1
|
JSON API 数据安全/隐私保护
api接口怎么使用
API接口的使用在当今的软件开发中非常普遍,它允许不同的应用程序或服务之间进行数据交换和功能交互。API接口使得开发人员能够将不同的系统或平台集成在一起,以实现更复杂的功能和应用。本文将详细介绍API接口的使用方法和代码实现。
|
网络协议 网络虚拟化
【HCIE】07.MPLS VPN单域(二)
【HCIE】07.MPLS VPN单域
165 0