王道OnlineJudge 14

题目 

二叉树层次建树就是一层一层的建树,从左到右。随着纵向层次的深入,结点的数量变化规律为:1→2→4→8→16→32。

先画图,然后看图可闭眼写代码 

右边为辅助队列,有多少个二叉树结点,就有多少个辅助队列结点。pcur指针始终指向父亲结点。

二叉树的层次建树

 代码

#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
//二叉树结构
typedef struct BiTNode{
	ElemType c;	//data
	struct BiTNode *left;	//指向BiTNode类型的指针 左孩子
	struct BiTNode *right;	//右孩子
}BiTNode,*BiTree;
//辅助队列结构
typedef struct tag{
	BiTree p;	//指向BiTNode类型的指针
	struct tag *pnext;	//指向tag类型的指针
}tag_t,*ptag_t;

//前序遍历——递归
void PreOrder(BiTree p)
{
	if(p){
		printf("%c",p->c);	//打印根节点
		PreOrder(p->left);	//打印左子树
		PreOrder(p->right);	//打印右子树
	}
}
int main()
{
	//树结构
	BiTree pnew;	//pnew用来指向申请新的树结点
	BiTree tree=NULL;	//tree用来指向树根,代表一颗二叉树
	ElemType c;	//字符类型数据
	//辅助队列结构
	ptag_t phead;	//头指针
    ptag_t ptail;	//尾指针
    ptag_t listpnew;//指向新结点的指针
    ptag_t pcur;	//指向二叉树中父亲结点的指针,用来判断左右孩子是否为空
    phead=ptail=listpnew=pcur=NULL;	//初始化
    while(scanf("%c",&c)){
    	if(c=='\n'){
    		break;
		}
		//calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0
		pnew=(BiTree)calloc(1,sizeof(BiTNode)); //申请一个二叉树结点空间
		pnew->c=c;	//往二叉树结点里放入数据
		listpnew=(ptag_t)calloc(1,sizeof(tag_t));//申请一个辅助队列结点空间,用来依次指向二叉树的每个结点
		listpnew->p=pnew;	//指向二叉树的结点
		//如果是第一个结点
        if(NULL==tree){
            tree=pnew;	//tree指向树的根结点
            phead=ptail=pcur=listpnew; //最开始,所有指针都指向第一个辅助队列结点
        }else{
            //让元素入队
            ptail->pnext=listpnew;
            ptail=listpnew;
            //接下来把b结点放入树中
            if(NULL==pcur->p->left){
                pcur->p->left=pnew;
            }else if(NULL==pcur->p->right){
                pcur->p->right=pnew;
                pcur=pcur->pnext; 	//当前结点左右孩子都有了,pcur就指向下一个
            }
        }
	}
	PreOrder(tree);
	return 0;		
}

run

abcdefghij
abdhiejcfg

  • 14
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值