数据结构——树的遍历

来源:互联网 发布:flinders大学 知乎 编辑:程序博客网 时间:2024/06/05 14:35

二叉树概念:一棵树拥有一个根结点,且所有结点的子结点都不超过2。

有序树概念:当子结点有特定顺序(左右之分)的树。
前序遍历(Preorder) :按照根结点,左子树,右子树的顺序输出结点编号。
中序遍历(Inorder)    :按照左子树,根结点,右子树的顺序输出结点编号。
后序遍历(Postorder):按照左子树,右子树,根结点的顺序输出结点编号。

前序遍历
void preParse(int u){//前序遍历 if(u==NIL)return;printf(" %d",u);preParse(T[u].l);preParse(T[u].r);}

中序遍历
void inParse(int u){//中序遍历  if(u==NIL)return;inParse(T[u].l);printf(" %d",u);inParse(T[u].r);}

后序遍历
void postParse(int u){//后序遍历  if(u==NIL)return;postParse(T[u].l);postParse(T[u].r);printf(" %d",u);}

递归求结点的深度:左子右兄弟表示法

(如果当前结点存在右侧兄弟结点,则不改变深度p直接进行递归调用,如果存在最左侧子结点,则先将深度加1再进行递归调用)

setDepth(u,p){D[u]=p;if(T[u].r!=NIL)setDepth(T[u].r,p);if(T[u].left!=NIL)setDepth(T[u].l,p+1);}

已知深度求结点:深度为k的二叉树,最多有2^k-1个结点。
已知结点求深度:具有n个结点的完全二叉树的深度为[log2n]+1.(log2n是以2为底n的对数)


TOJ 1222/1223/1224 先/中/后序遍历二叉树

描述

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

输入

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

1 2 0 3 4 -1得到的二叉树如下:

输出

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

样例输入

样例输出

#include<stdio.h>#include<math.h>int a[100],i;void first(int n){//前序printf(" %d",a[n]);if(a[2*n+1]!=0)first(2*n+1); if(a[2*n+2]!=0)first(2*n+2);}

void first(int n){//中序 if(a[2*n+1]!=0)first(2*n+1); printf(" %d",a[n]); if(a[2*n+2]!=0)first(2*n+2);}
void first(int n){//后序 if(a[2*n+1]!=0)first(2*n+1); if(a[2*n+2]!=0)first(2*n+2);printf(" %d",a[n]);}
int main(){int t,b,k;scanf("%d",&t);while(t--){i=0;while(1){scanf("%d",&b);if(b==-1)break;a[i++]=b;}k=int(log(i)/log(2)+1.1);//强制转换,如果+1的话可能会出错。 printf("%d",k);first(0);puts("");}}

然后下面是童冰学姐用指针(队列?)做的..我还没看懂..等我日后厉害了再回头来看..

#include<stdio.h>#include<stdlib.h>#include<math.h>struct towtree{    int n;    towtree *left,*right;}*root;int k,m;towtree *push(){towtree *Q[100];   int  front=1,rear=0;  /*队列指针如此设定,便于操作*/   int a;   towtree *root=NULL,*s;   while(scanf("%d",&a),a!=-1)   /* '#'为输入结束标志*/   {   m++;     if(!a) s=NULL;        /* 输入空格为虚结点*/ else   {     s=(towtree *)malloc(sizeof(towtree));/*建立新结点*/     s->n=a; s->left=NULL; s->right=NULL;   }   Q[++rear]=s;   /*虚结点指针NULL或新结点地址入队*/       if(rear==1) root=s;    /*第一个结点为根结点*/   else   {     if(s&&Q[front])  /* 孩子和双亲结点都不是虚结点*/     if(rear%2==0)         Q[front]->left=s;/* 新结点为左孩子*/        else Q[front]->right=s;/*新结点为右孩子*/        if(rear%2==1) front++;  /*左右孩子都已处理结点出队*/  }   }   return root;}void first(towtree *p){//前序遍历     if(p!=NULL)    {            if(p->n!=0)        printf(" %d",p->n);        first(p->left);        first(p->right);    }}int main(){    int t,p;    scanf("%d",&t);    while(t--)    {        m=k=0;        root=push();        p=fabs(log(m)/log(2)+1.1);        printf("%d",p);        first(root);        puts("");    }}



1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝开过店想给别家做客服怎么办 学网上开店别人不主动教你怎么办 淘宝店铺身份信息复核逾期了怎么办 一件代发进货后如果没卖出去怎么办 国外供货商收了钱不发货怎么办 企业被注销之后淘宝企业店怎么办 在淘宝上买了东西店家关门了怎么办 在淘宝上买东西被店家骂了怎么办 淘宝店家错发了两次货怎么办 我的身份证注销了淘宝支付宝怎么办 买了空调坏了店家不管怎么办 支付宝充话费没到账也不退款怎么办 淘宝上店家关铺无法赔偿怎么办 未发货申请退款卖家拒绝怎么办 淘宝订单未发货买家恶意退款怎么办 淘宝被限制购买还有没退款的怎么办 复制粘贴了打字在复制下页怎么办? 得了抑郁症没办法还贷款了怎么办 淘宝东西退了商家不退钱怎么办 京东买东西付款后显示未付款怎么办 不能吃小龙虾的人吃了怎么办 闲鱼退货卖家收到货不退款怎么办 没收到货申请退款卖家不同意怎么办 咸鱼买家不确认收货老退款怎么办 买家买了确认收货然后退款怎么办 买家收确认收货后还申请退款怎么办 淘宝收到货后买家故意说少货怎么办 对面商铺放很大声音乐怎么办 在店面住隔壁商铺一直放音乐怎么办 淘宝卖家把买家评论删了怎么办 淘宝店铺上当顾客说再看看怎么办 车辆摇号申请说手机号注册怎么办 如果在微商手上买到假东西怎么办? 登陆微信显示版本过低该怎么办 苹果手机登陆微信版本过低怎么办 微信版本过低无法登怎么办录 登入微信显示版本过低登不上怎么办 微信版本过低无法使用小程序怎么办 小米4s微信反应很慢怎么办 手机网页缓存的视频播放不了怎么办 ios微信占用内存太大了怎么办