首页 > 其他分享 >已知二叉树的先序和后序求任意一中序

已知二叉树的先序和后序求任意一中序

时间:2024-04-23 19:55:45浏览次数:32  
标签:遍历 后序 int al 唯一 二叉树 先序

假设一个二叉树上所有结点的权值都互不相同。

我们可以通过后序遍历和中序遍历来确定唯一二叉树。

也可以通过前序遍历和中序遍历来确定唯一二叉树。

但是,如果只通过前序遍历和后序遍历,则有可能无法确定唯一二叉树。

现在,给定一组前序遍历和后序遍历,请你输出对应二叉树的中序遍历。

如果树不是唯一的,则输出任意一种可能树的中序遍历即可。

输入格式

第一行包含整数 N,表示结点数量。

第二行给出前序遍历序列。

第三行给出后序遍历序列。

一行中的数字都用空格隔开。

输出格式

首先第一行,如果树唯一,则输出 Yes,如果不唯一,则输出 No。

然后在第二行,输出树的中序遍历。

注意,如果树不唯一,则输出任意一种可能的情况均可。

数据范围

1≤N≤30

输入样例1:

7
1 2 3 4 6 7 5
2 6 7 4 5 3 1

输出样例1:

Yes
2 1 6 4 7 3 5

输入样例2:

4
1 2 3 4
2 4 3 1

输出样例2:

No
2 1 3 4

题解

我们先说明下什么情况下会出现 树不唯一
设先序遍历的第一个元素下标是 al, 后序遍历的最后一个元素下标是 br ,那么当 al + 1 == br - 1的时候树不唯一 (ps: 理由如下图)

从上面的图中可以观察到 以3为根的子树下的4节点既可以树左子树又可以是右子树 (ps : 不论是左子树还是右子树它的先序和后序遍历序列是相同的)


下面代码中 三个感叹号那里的两个 for 循环是 用来确定build的 先序和后序的左右闭区间的边界的

贴个图,大家一定看的懂

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
bool is_only = true;  //  树是否唯一的标志
int a[N], b[N];
unordered_map<int,int> l, r;
int build(int al, int ar, int bl, int br)   // a 先序, b 后序
{
    int root = a[al];
    if (al >= ar) return root;
    
    if (a[al + 1] == b[br - 1])    // 只要进这个分支就说明不唯一了
    {
        is_only = false;    
        l[root] = build(al + 1, ar, bl, br - 1);  // 这里假设是左子树
    }
    else
    {
        int ir, jr;    // !!!

标签:遍历,后序,int,al,唯一,二叉树,先序
From: https://www.cnblogs.com/xxctx/p/18153660

相关文章

  • 已知二叉树的前序和中序遍历求后序遍历
    假设二叉树上各结点的权值互不相同且都为正整数。给定二叉树的前序遍历和中序遍历,请你输出二叉树的后序遍历序列。输入格式第一行包含整数N,表示二叉树结点总数。第二行给出二叉树的前序遍历序列。第三行给出二叉树的中序遍历序列。输出格式输出二叉树的后序遍历的第一个数......
  • 已知二叉树的后序和中序遍历求前序遍历
    假设二叉树上各结点的权值互不相同且都为正整数。给定二叉树的后序遍历和中序遍历,请你输出二叉树的前序遍历的最后一个数字。输入格式:第一行包含整数N,表示二叉树结点总数。第二行给出二叉树的后序遍历序列。第三行给出二叉树的中序遍历序列。输出格式输出二叉树的前序遍......
  • 二叉树深度的题目
    #这是一道关于二叉树深度的题目。题目要求我们输入一个二叉树的结点数和每个结点的左右子结点编号,然后输出这棵二叉树的最大深度。#对于这个问题,我们可以使用递归的方法来求解。以下是一个Python的代码示例: depth=1defdfs(node,depth):ifnode==0:retu......
  • JZ8 二叉树的下一个结点
    #include<cstddef>classSolution{public:vector<TreeLinkNode*>nodes;//用户得到的输入只有一个子树根节点TreeLinkNode*GetNext(TreeLinkNode*pNode){TreeLinkNode*root=pNode;//获取根节点 //顺着next指针一直......
  • JZ79 判断是不是平衡二叉树
    classSolution{public://求深度intdeep(TreeNode*root){if(root==NULL)return0;//求左右子树的深度intleft=deep(root->left);intright=deep(root->right);return......
  • 【二叉树的前中后序遍历】迭代法
    三种遍历都是用栈维护二叉树前序遍历节点顺序前序遍历模拟前序遍历即可,记录顺序和入栈顺序一致classSolution{publicList<Integer>preorderTraversal(TreeNoderoot){List<Integer>ans=newArrayList<>();if(root==null)returnans;......
  • JZ86 在二叉树中找到两个节点的最近公共祖先
    classSolution{public://用来判断是否找到节点boolflag=false;//dfs遍历得到路径,递归遍历,也就是先序遍历根左右//传入参数:节点,容器,要找的值voiddfs(TreeNode*root,vector<int>&path,into){//判断根节点的值是否是要找的......
  • 【根据前序和中序遍历构造二叉树】栈+迭代 || 递归
    105.从前序与中序遍历序列构造二叉树栈+迭代规律前序遍历中相邻节点u和v,v节点一定是u节点的左节点或者是其自身某个祖先的右节点一个没有右节点的链,中序遍历是从叶子到根,前序遍历是从根到叶子解题思路用一个栈维护前序遍历的节点用一个指针p指向中序遍历的第一个叶子节......
  • 给出二叉树的前序遍历和中序遍历--还原二叉树
    voidf(intidxroot){ //根据前序遍历和中序遍历还原二叉树if(idxroot==n+1)return;introot=pre[idxroot];boolcheck=true;map<int,int>lcmp,rcmp;//当前节点的左孩子集合和右孩子集合for(inti=1;i<=n;i++){if(vis[mid[i]]&&mid[i]!......
  • JZ32 从上往下打印二叉树
    /*structTreeNode{intval;structTreeNode*left;structTreeNode*right;TreeNode(intx):val(x),left(NULL),right(NULL){}};*/classSolution{public:vector<int>PrintFromTopToBottom(TreeNode*root){......