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

简介: 二叉树的中后序遍历构建及求叶子
题目描述
按中序遍历和后序遍历给出一棵二叉树,求这棵二叉树中叶子节点权值的最小值。
输入保证叶子节点的权值各不相同。
输入
第一行输入一个整数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;
}
相关文章
|
人工智能 Java 测试技术
二叉树通过前序中序来构建二叉树(炒鸡详细到每一步)
二叉树通过前序中序来构建二叉树(炒鸡详细到每一步)
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】
43 0
树和二叉树(三)
树和二叉树(三)
|
7月前
|
存储
树与二叉树
树与二叉树
|
算法
【LeetCode题目详解】(五)144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、104.二叉树的最大深度、110.平衡二叉树
【LeetCode题目详解】(五)144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、104.二叉树的最大深度、110.平衡二叉树
56 0
|
存储 算法 数据库管理
树和二叉树(二)
树和二叉树(二)
|
存储 机器学习/深度学习
认识一棵二叉树
大家好,我是王有志。今天要学习的是编程中绕不开的结构--树,无论是二分搜索树,红黑树,B+树,还是的决策树和随机森林,都和树息息相关。
74 0
认识一棵二叉树
|
存储 搜索推荐
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(下)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(下)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(上)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(上)
|
存储 算法
九、树和二叉树2
九、树和二叉树
九、树和二叉树2
下一篇
DataWorks