首页 > 其他分享 >给出中序和按层遍历,求该树的先序遍历,后序遍历,叶子结点。

给出中序和按层遍历,求该树的先序遍历,后序遍历,叶子结点。

时间:2023-12-24 18:33:26浏览次数:37  
标签:求该 遍历 r1 int 中序 l1 include

一切的核心是怎么利用中序和按层遍历构建二叉树?

1.优化空间很大,可以提前预处理记录每个数对应的位置,还可以vis数组记录这个点是不是已经作为根了。

2.我们考虑到每次找到当前中序要处理区间,里面的数记为集合mid,我们从前到后看层序遍历中的哪个数最先出现在mid中。那么这个数就是当前中序处理区间的根,这个新根的左边是左子树,右边是右子树,我们可以递归处理。

3.对于叶子节点,就是当他作为根的时候,没有左右节点,也就无法进行进一步深搜,flag记一下就可以了。

#include<stdio.h>
#include<vector>
#include<map>
#include<algorithm>
#include <algorithm>
#include <iostream>
#include<string>
using namespace std;

vector<int> InOrder, LevelOrder;
vector<int>ans;
vector<int>ans1,ans2;
void getPreOder(int l1, int r1, int l2, int r2) {
    int i, j;
    //l1,r1_inorder
    //l2,r2_levelorder
    //在中序中找到层序遍历当前的根节点
    for(i = l2; i <= r2; i++) {
        bool flag = false;
        for(j = l1; j <= r1; j++) {
            if(LevelOrder[i] == InOrder[j]) {
               // cout << LevelOrder[i]<<" ";
               ans1.push_back(LevelOrder[i]);
                flag = true;
                break;
            }
        }
        if(flag) break;
    }
    bool flag=false;
    if(j > l1) {getPreOder(l1, j - 1, 0, r2);flag=true;}
    if(j < r1) {getPreOder(j + 1, r1, 0, r2);flag=true;}
    if(!flag)ans.push_back(LevelOrder[i]);
}

// 递归构造后序遍历字符串
void getPostOrder(int l1, int r1, int l2, int r2) {
    int i, j;
    for(i = l2; i <= r2; i++) {
        bool flag = false;
        // 在中序遍历中找到当前层次遍历结点对应的位置
        for(j = l1; j <= r1; j++) {
            if(LevelOrder[i] == InOrder[j]) {
                flag = true;
                break;
            }
        }
        if(flag) break;
    }
   // cerr<<InOrder[j]<<endl;
    // 递归处理左子树
    if(j > l1) getPostOrder(l1, j - 1, 0, r2);
    // 递归处理右子树
    if(j < r1) getPostOrder(j + 1, r1, 0, r2);
    // 输出当前根节点的值
     ans2.push_back(InOrder[j]);
    //cout << InOrder[j]<<" ";
}

int main() {
   
    int n;
    cin>>n;
 // 读入层次遍历的字符串
      for(int i=0;i<n;i++){
      int x;cin>>x;
      LevelOrder.push_back(x);
      }
      //中序遍历
       for(int i=0;i<n;i++){
      int x;cin>>x;
      InOrder.push_back(x);
      }
    // 调用 getPostOrder 函数并传入整棵树的中序遍历区间和层次遍历区间
    getPreOder(0, InOrder.size() - 1, 0, LevelOrder.size() - 1);
    //cout<<endl;
    getPostOrder(0, InOrder.size() - 1, 0, LevelOrder.size() - 1);
    //cout<<endl;
for(auto x:ans)cout<<x<<" ";cout<<endl;
for(auto x:ans1)cout<<x<<" ";cout<<endl;
for(auto x:ans2)cout<<x<<" ";cout<<endl;
    return 0;
}

标签:求该,遍历,r1,int,中序,l1,include
From: https://www.cnblogs.com/mathiter/p/17924691.html

相关文章

  • 二叉树给出先序和中序遍历序列,求和树 要求输出中序遍历序列;
    1.就算不知道用vector的初始化,也可以手动赋值创建子数组。2.不断找到当前序列对应的根节点,计算他的子节点的总和,在这样递归处理过程中,注意要中序输出,所以对于是先遍历完左子树,然后输出答案,然后遍历右子树#include<bits/stdc++.h>usingnamespacestd;#definelllonglong//......
  • 二叉树已经知道先序中序推后序
    https://www.acwing.com/problem/content/3601/不断找新的先序的根节点,根据位置切割中序,根据中序左右子树大小反切割先序,找到左子树对应的先序中序,然后递归处理#include<stdio.h>#include<vector>#include<map>#include<algorithm>#include<algorithm>#include<iostream>......
  • re | 通过PEB遍历进程模块
    re|通过PEB遍历进程模块最近在设计实验,重新写一些代码存一下:使用vc6编译通过。比较好的参考文章:https://www.cnblogs.com/bokernb/p/6404795.html#include<stdio.h>#include<windows.h>/*typedefstruct_LIST_ENTRY{struct_LIST_ENTRY*Flink;struct_LIST_......
  • 320二叉树的不同形态(已知层次遍历和中序遍历创建二叉树;输出叶子结点(从左到右);后序遍历)
    题目:二叉树的不同形态问题描述给定二叉树T(树深度H<=10,深度从1开始,结点个数N<1024,结点编号1~N)的层次遍历序列和中序遍历序列,输出T从左向右叶子结点以及二叉树先序和后序遍历序列。输入格式输入共三行:第一行是整数n,表示二叉树中的结点数目;第二行有n个整数,表示该二叉树的层次遍......
  • 318二叉树遍历
    1#include<stdio.h>2#include<string.h>3#include<stdlib.h>4typedefstructtreenode{5chardata;6structtreenode*lchild;7structtreenode*rchild;8}treenode,*tree;910treecreateTree(char*preorder,char......
  • 315二叉树扩展先序遍历转中序遍历
    题目:二叉树扩展先序遍历转中序遍历问题描述编一个程序,读入用户输入的一串扩展先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的扩展先序遍历字符串:ABC##DE#G##F###其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出......
  • 429. N 叉树的层序遍历(中)
    目录题目题解:BFS题目给定一个N叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由null值分隔(参见示例)。题解:BFSclassSolution:deflevelOrder(self,root:'Node')->List[List[int]]:ifnotroot:......
  • 107. 二叉树的层序遍历 II(中)
    目录题目题解:BFS题目给你二叉树的根节点root,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)题解:BFS用BFS把每层的结点存在一个单独的列表里,最后翻转整个结果列表classSolution:deflevelOrderBottom(self,root:Op......
  • 103. 二叉树的锯齿形层序遍历(中)
    目录题目题解:BFS题目给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。题解:BFS用BFS把每一层的结点存在一个列表里面,然后判断一下如果是偶数层就翻转列表,最后都加入结果列表返回即可classSo......
  • Java中的page集合的遍历(取值/赋值)
    Page<FwSjJbEntity>page1=newPage<>(page,pageSize);LambdaQueryWrapper<FwSjJbEntity>queryWrapper=newLambdaQueryWrapper<>();Page<FwSjJbEntity>jbEntityPage=newPage<FwSjJbEntity>();if(name==null||name.equals......