GPTL—练习集—006树的遍历

#include<bits/stdc++.h>
using namespace std;

typedef int daTp;//datatype
typedef struct BTNode *position;
typedef position BTree;
const int MAXN=30;
struct BTNode
{
    daTp data;
    position lChild,rChild;
};
BTree build(daTp in[],daTp post[],int n)//利用中序和后序遍历生成二叉树
{
    BTree T=NULL;
    if(n)
    {
        T=new BTNode;
        T->data=post[n-1];
        int ln=0,rn=0;
        bool flag=true;
        daTp lin[MAXN],lpost[MAXN],rin[MAXN],rpost[MAXN];
        for(int i=0;i<n;i++)
        {
            if(in[i]==T->data)
            {
                flag=false;
                continue;
            }
            if(flag) lin[ln++]=in[i];
            else rin[rn++]=in[i];
        }
        for(int i=0,k=0;i<n;i++)
        {
            if(i<ln) lpost[i]=post[i];
            else rpost[k++]=post[i];
        }
        T->lChild=build(lin,lpost,ln);
        T->rChild=build(rin,rpost,rn);
    }
    return T;
}
void levelOrder(BTree T)//层序遍历
{
    if(!T) return;
    queue<BTree>qu;
    qu.push(T);
    BTree tr=T;
    while(!qu.empty())
    {
        tr=qu.front();
        qu.pop();
        cout<<(tr==T?"":" ")<<tr->data;
        if(tr->lChild) qu.push(tr->lChild);
        if(tr->rChild) qu.push(tr->rChild);
    }
}
int main()
{
    int n;
    daTp inOd[MAXN],postOd[MAXN];
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            cin>>postOd[i];
        for(int i=0;i<n;i++)
            cin>>inOd[i];
        BTree T=build(inOd,postOd,n);
        levelOrder(T);
        cout<<endl;
    }
    return 0;
}
时间: 2024-08-26 02:56:09

GPTL—练习集—006树的遍历的相关文章

团体程序设计天梯赛-练习集L2-006 树的遍历

链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 题解:根据后序中序建树,层序遍历输出的裸题,建树的基本思想是利用递归,层序遍历可以利用队列,详细参见代码 代码: 1 #include<bits/stdc++.h> 2 #define inf 0x3f3f3f3f 3 using namespace std; 4 typedef long long ll; 5 const int M

PAT 团体程序设计天梯赛-练习集 L2-006. 树的遍历

//结构清晰,容易理解. #include<cstdio>#include<cmath>#include<cstring>#include<queue>#include<stack>#include<cstdlib>#include<vector>#include<map>#include<string>#include<iostream>#include<algorithm>

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

pat L2-006. 树的遍历

L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其后序遍历序列.第三行给出其中序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树的层序遍历的序列.数字间以1个空格分隔,行首尾不得有多余空格. 输入样例: 7 2

一步两步学算法之树的遍历 非递归实现

递归的程序其实我觉得可读性较高  但是执行效率低下 为了做一道PAT的题 去理解了下非递归实现树的遍历 用一个栈来实现 先序遍历 先访问节点 再把节点push进栈 再访问 再push 直到next=NULL 然后pop出一个节点 也就是弹出一个节点 访问它的右边 再弹出 在访问 中序遍历 把左边节点全部push进栈 然后弹出 访问中间 再访问右边  再弹出 一直循环 后序遍历 比较难理解  要入两次栈才能访问 先左边全部入栈  栈顶是左边的元素 此书不能访问 因为右边还没入栈 下面给出先序和后序

树及遍历

节点深度:从根到节点的路径长度,d(root)=0 节点高度:从节点到树叶的最长路径的长,h(leaf)=0 树高为根高,树的深度=树的高度 树的遍历: 递归的前.中.后序还是蛮简单的: 1 //树的遍历 2 void preorder_recursive(PtrToBiNode T){ //二叉树递归先序遍历 3 if (T){ //这句不要忘记 4 printf("%d ", T->Element); 5 preorder_recursive(T->left); 6 p

poj 2513 Colored Sticks(欧拉通路+并查集+字典树)

题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色,现在给定每个木棍两端的颜色,不同木棍之间拼接需要颜色相同的 端才可以,问最后能否将N个木棍拼接在一起. 解题思路:欧拉通路+并查集+字典树.欧拉通路,每个节点的统计度,度为奇数的点不能超过2个.并查集,判断节点 是否完全联通.字典树,映射颜色. #include <cstdio> #include <cstring> #include <string> #includ

leetcode404-----简单的树的遍历

Find the sum of all left leaves in a given binary tree. Example: 3 / 9 20 / 15 7 There are two left leaves in the binary tree, with values 9 and 15 respectively. Return 24. 题目给出的意思很简单.就只是单纯的树的遍历而已.意思是计算出所有左叶子节点的值的和. 我采用递归的方式表示我的遍历顺序,其实主要的是要理解题目的意思,这里

树的遍历 | Tree Traversal

树的遍历方式总体上有两种:DFS和BFS: 其中DFS包含了前序.中序和后序遍历,而BFS则为层次遍历. DFS的实现方式: (1) 递归: (2) 非递归,使用辅助栈: 递归程序 public class Recursion { public void preorderRec(TreeNode root) { if (root == null) { return; } System.out.println(root.val); // visit the node preorderRec(roo