二叉树的遍历

二叉树的后序遍历:

题目描述

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

输入

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

输出

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

样例输入
2
1 -1
1 2 0 3 4 -1
样例输出

1 1

3 3 4 2 1


代码:

#include <cmath>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <malloc.h>
#define N 1005 
using namespace std;

typedef struct biNode
{
	int data;
	biNode* lchild;
	biNode* rchild;	
}node,*biTree;	//node* 等价于biTree 

biTree* q[N];	//注意这里不是biTree q[N],q数组保存的是指向结点的结点的地址(指针的指针的地址)
biTree root;

void createTree()	//创建二叉树
{
	int num;
	int i=0,j=0;	//i,j保存的下标 
	bool flag=true;
	while(scanf("%d",&num)==1&&num!=-1)
	{
		biTree p=(biTree)malloc(sizeof(node));
		if(flag)	//创建根结点,用flag变量控制 
		{
			if(num==0)	//当输入为 0 -1时,直接退出 
				exit(0); 
			root=p;
			root->data=num;
			root->lchild=NULL;
			root->rchild=NULL;
			q[i++]=&root->lchild;	//注意这代码是怎么写的 
			q[i++]=&root->rchild;
			flag=false;
		}
		else
		{
			if(num!=0)
			{
				p->data=num;
				p->lchild=NULL;
				p->rchild=NULL;
				q[i++]=&p->lchild;
				q[i++]=&p->rchild;
				*q[j++]=p;
			}
			else
			{
				delete p;
				j++;	//也要j加1 
			}
	
		}
	}	
}

int deepth(biTree t)	//递归,求二叉树的深度 
{
	if(t==NULL)
		return 0;
	int x=deepth(t->lchild);
	int y=deepth(t->rchild);
	return max(x,y)+1;
}

void traverse(biTree t)	//递归,后序遍历 
{
	if(t==NULL)
		return ;
	traverse(t->lchild);
	traverse(t->rchild);
	cout<<  t->data  <<" ";
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--) 
	{
		createTree(); 
		cout<<deepth(root)<<" ";
		traverse(root);
	}
	return 0;
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值