【TOJ 1224】数据结构练习题――后序遍历二叉树

Description

给定一颗二叉树,要求输出二叉树的深度以及后序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000。

Input

输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树。每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理。二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替)。

Output

输出每棵二叉树的深度以及后序遍历二叉树得到的序列。

Sample input

2
1 -1
1 2 0 3 4 -1

Sample output

1 1
3 3 4 2 1

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1005],k;               //k是二叉树元素总数
int post(int n)                  //n是从1开始的参数,表示遍历到的第n个元素
{
    if(n>k)return 0;

    if(a[2*n]!=0)              //避免无效遍历导致的内存使用过大
    post(2*n);                   //先从左遍历

    if(a[2*n+1]!=0)
    post(2*n+1);                 //再从右遍历 

    if(a[n])
        cout<<" "<<a[n];
}
int deep(int n)
{
    int m;
    if(n>k||a[n]==0)return 0;
    int left=deep(2*n);
    int right=deep(2*n+1);
    m=max(left,right)+1;
    return m;
}
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        k=0;
        while(cin>>n)
        {
            if(n==-1)break;
            a[++k]=n;
        }
        cout<<deep(1);                   //深度从1开始递归
        post(1);                     //中序遍历也从1开始递归
        cout<<endl;
        memset(a,0,sizeof a);
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/kannyi/p/8562989.html

时间: 2024-10-10 21:54:26

【TOJ 1224】数据结构练习题――后序遍历二叉树的相关文章

【数据结构】 非递归前中后序遍历二叉树

数据结构学的递归了,深入了解后写一个三序非递归的版本. //测试数据:abd##eg##h##c#f## #include <cstdio> #include <iostream> typedef char ElemType; typedef struct Node { ElemType elem; struct Node *lchild,*rchild; }Node,*BiTree; typedef struct{ BiTree *base; BiTree *top; int s

非递归 后序遍历二叉树

方法有很多,这里只举一种,先定义栈结点的数据结构typedef struct{Node * p; int rvisited;}SNode //Node 是二叉树的结点结构,rvisited==1代表p所指向的结点的右结点已被访问过. lastOrderTraverse(BiTree bt){ //首先,从根节点开始,往左下方走,一直走到头,将路径上的每一个结点入栈. p = bt; while(bt){ push(bt, 0); //push到栈中两个信息,一是结点指针,一是其右结点是否被访问过

前序、中序、后序遍历二叉树

/*(1) 建立一棵含有n个结点的二叉树,采用二叉链表存储建立结点的结构体类型: 按照先序遍历法将二叉树的序列给出: 动态申请内存空间存储新结点: 建立结点间的关系:(2) 前序(或中序.后序)遍历该二叉树*/#include<stdio.h>#include<malloc.h> // char DataType;typedef struct Node{ char data; struct Node *Lchild; struct Node *Rchild;}BiTNode,*Bi

非递归前中后序遍历二叉树

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 写在前面: 最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实

非递归后序遍历二叉树(1)

1 void postOrder3(BinTree *root) //非递归后序遍历 2 { 3 stack<BinTree*> s; 4 BinTree *cur; //当前结点 5 BinTree *pre=NULL; //前一次访问的结点 6 s.push(root); 7 while(!s.empty()) 8 { 9 cur=s.top(); 10 if((cur->lchild==NULL&&cur->rchild==NULL)|| 11 (pre!=N

前序、中序、后序遍历二叉树的非递归实现

class Node { public: int data; Node* left; Node* right; }; void pre-order(Node* root) { stack<Node*> stk; if (root) stk.push(root); while (!stk.empty()) { Node* nd = stk.top(); cout << nd->data << endl; stk.pop(); if (nd->right) st

(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. 可以和(编程训练)再回首,数据结构--二叉树的前序.中序.后序遍历(递归)对比着看 [问题描述] 根据顺序存储结构建立二叉树的二叉链表,并对二叉树进行先序.中序.后序遍历. [基本要求] ·功能:根据顺序存储结构建立二叉树的二叉链表,并进行先序.中序.后序遍历. ·输入:输入二叉树的顺序存储. ·输出:二叉树的先序.中序.后序遍历序

数据结构_二叉树后序遍历

/* 后序遍历二叉树 思路: 1,若当前结点没有左右孩子,则访问并出栈 2,若当前结点有左孩子或右孩子,并且孩子被访问过,则访问并出栈(若当前结点有左右孩子,只要有一个孩子已被访问,那么它的两个孩子都已被访问,这与入栈顺序有关,它的孩子在栈中一定在它的上方) 3,若当前结点有左孩子或右孩子,并且都没有被访问,那么先将右孩子入栈,再将左孩子入栈 */ void beh_Order(BiTree T) { InitStack(S); BiTree pCur,pPre=NULL,p; Push(s,T

C语言递归实现二叉树的先序、中序、后序遍历

#include <stdio.h> #include <stdlib.h> //*****二叉树的二叉链表存储表示*****// typedef struct BiNode { char data; struct BiNode *lchild, *rchild; }BiNode, *BiTree; //*****按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树构造二叉链表表示的二叉树T*****// void CreateBiTree(BiTree &T) {