首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

PAT甲级-1020 Tree Traversals (25分)

  • 24-03-03 00:43
  • 4661
  • 6888
blog.csdn.net

点击链接PAT甲级-AC全解汇总

题目:
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

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

Sample Output:

4 1 6 3 5 7 2
  • 1

题意:
输入二叉树的后序和中序,输出层序

算法笔记的代码:
这道题很早之前看算法笔记的时候就照着打了一遍,先附上算法笔记的代码,再附上我重写的代码

#include
#include
using namespace std;
const int maxn=50;
struct node{
    int data;
    node *lchild,*rchild;
};
int pre[maxn],in[maxn],post[maxn];
int n;

node* create(int postl,int postr,int inl,int inr){
    if(postl>postr){
        return NULL;
    }
    node* root=new node;
    root->data=post[postr];
    int k;
    for(k=inl;k<=inr;k++){
        if(in[k]==post[postr])
            break;
    }
    int numleft=k-inl;
    root->lchild=create(postl,postl+numleft-1,inl,k-1);
    root->rchild=create(postl+numleft,postr-1,k+1,inr);
    return root;
}
int num=0;
void BFS(node* root){
    queue<node*>q;
    q.push(root);
    while(!q.empty()){
        node* now=q.front();
        q.pop();
        printf("%d",now->data);
        num++;
        if(num<n)
            printf(" ");
        if(now->lchild!=NULL)
            q.push(now->lchild);
        if(now->rchild!=NULL)
            q.push(now->rchild);
    }
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&post[i]);
    }
    for(int i=0;i<n;i++){
        scanf("%d",&in[i]);
    }
    node* root=create(0,n-1,0,n-1);
    BFS(root);
    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

我的思路:
如例子

后序:2 3 1 5 7 6 4
中序:1 2 3 4 5 6 7
  • 1
  • 2

手动寻找的思路:

  1. 从后序找到最后一个 4 ,肯定是根节点,在中序中找根节点 4
  2. 中序中的根节点 4 切开了左子树和右子树
  3. 在后序中分别找左子树和右子树的最后一个(即中序4前面的 在后序中最后一个 和 后序的倒数第二个) 1 和 6
  4. 中序中的 1 和 6 分别切开了左字数和右子树的左右子树
    …
  5. 直到第3步找不到点

代码思路:

因为结果是要求层序,所以借用一个队列保存所有的根节点,再依次输出根节点就行,其中第3步需要用两个set记录左右子树的结点

我的代码:

#include
using namespace std;

int main()
{
    int N;
    cin>>N;
    int postorder[N]={0};
    int inorder[N]={0};
    for(int i=0;i<N;i++)cin>>postorder[i];
    for(int i=0;i<N;i++)cin>>inorder[i];
    set<int>rooted;

    deque<int>res;
    res.push_back(postorder[N-1]);
    rooted.insert(postorder[N-1]);

    while(!res.empty())
    {
        //1.在后序中找到的根,直接输出层序
        int root=res.front();
        res.pop_front();
        if(root!=postorder[N-1])cout<<" ";
        cout<<root;

        //2.找到根在中序中的位置
        //根左边的是左子树,右边的是右子树
        set<int>left_tree,right_tree;

        int index=N-1,index_root;
        while(inorder[index--]!=root);
        index_root=index+1;//找到root
        index=index_root-1;//->root左边,对中序从root往左是左子树
        while(index>=0&&!rooted.count(inorder[index]))
        {
            left_tree.insert(inorder[index]);
            index--;
        }
        index=index_root+1;//->root右边,对中序从root往右是右子树
        while(index<N&&!rooted.count(inorder[index]))
        {
            right_tree.insert(inorder[index]);
            index++;
        }

        //3.在后序中最右的是左右子树的根
        //从右往左第一个在左子树中的是左子树的根节点
        index=N-1;
        while(index>=0&&!left_tree.count(postorder[index]))index--;
        if(index>=0)
        {
            res.push_back(postorder[index]);
            rooted.insert(postorder[index]);
        }

        //从右往左第一个在右子树中的是右子树的根节点
        index=N-1;
        while(index>=0&&!right_tree.count(postorder[index]))index--;
        if(index>=0)
        {
            res.push_back(postorder[index]);
            rooted.insert(postorder[index]);
        }
    }
    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

感觉还是算法笔记中的易懂些。

注:本文转载自blog.csdn.net的邂逅模拟卷的文章"https://blog.csdn.net/qq_34451909/article/details/105286720"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top