zoukankan      html  css  js  c++  java
  • L2-006 树的遍历 (25 分)

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

    输入格式:

    输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

    输出格式:

    在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

    输入样例:

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

    输出样例:

    4 1 6 3 5 7 2
    

    思路:根据后序遍历可以知道 根结点的值 ;在中序遍历中找到根结点的位置 对左右子树进行判断;又因为是后续遍历,遍历得到的是右子树,所以先建右子树

    参考文章(道理相同):https://blog.csdn.net/hacker_zhidian/article/details/60770262 

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int INF = -1;
    const int N = 10010;
    int mid[N];//存中序遍历 
    int aft[N];//后续遍历 
    int pos;
    struct Node{
    	int l;
    	int r;
    	int v;
    }node[N];
    void build(int l,int r,int n)
    {
    	if(l>=r)//节点不存在 
    	{
    		node[n].v=INF;
    		return ;
    	}
    	int root=aft[pos--];//从后面往前面找结点 
    	node[n].v=root;//结点 
    	node[n].l=2*n;//左子树 
    	node[n].r=2*n+1;//右子树 
    	int x=find(mid,mid+r,root)-mid;//结点在中序遍历中的位置,讨论左右 
    	build(x+1,r,2*n+1);//因为是后序遍历 所以先建右子树 
    	build(l,x,2*n);
    }
    int  main()
    {
    	int n;
    	cin>>n;
    	pos=n-1;
    	for(int i=0;i<n;i++)
    		cin>>aft[i];
    	for(int i=0;i<n;i++)
    		cin>>mid[i];
    	build(0,n,1);
    	queue<int>q;
    	//for(int i=0;i<n;i++)
    	//	cout<<node[i].v<<" ";
    	q.push(1);
    	int index;
    	while(!q.empty())
    	{
    		index=q.front();
    		q.pop();
    		if(node[index].v!=INF)
    		{
    			if(index==1)
    				cout<<node[index].v;
    			else
    				cout<<" "<<node[index].v;
    			q.push(node[index].l);
    			q.push(node[index].r);
    		}
    	}
    }
  • 相关阅读:
    String.trim()这个细节不能忘记
    Integer.parseInt(f.trim())中String f要加trim()
    类属性不能写在try{}catch(){}里面
    011--TypeScript泛型
    010--TypeScript里面的this和重载
    009--函数(基本实例和函数类型)
    007--TypeScript之类的修饰符
    008--TypeScript存储器和静态属性
    006--TypeScript之类
    005--TypeScript接口
  • 原文地址:https://www.cnblogs.com/yyaoling/p/12260435.html
Copyright © 2011-2022 走看看