广度优先遍历二叉树

    同学电面被问到一个问题:如何获得完全二叉树的最后一个节点?二叉树以链表的形式存储。

 

    没想到合适的办法,用广度遍历吧,最后一个节点就是了,代码如下:

 

#include <stdio.h>
#include <stdlib.h>

//树节点的定义
struct TNode{
	int value;
	struct TNode *left;
	struct TNode *right;
};

//队列节点的定义
struct QNode{
	struct TNode *p;
	struct QNode *next;
};

//队列的定义
struct Queue{
	struct QNode *front;
	struct QNode *rear;
};

//初始化队列
void InitQueue(struct Queue *Q){
	Q->front=Q->rear=(struct QNode*)malloc(sizeof(struct QNode));
	Q->front->next=NULL;
}

//入队列
void EnQueue(struct Queue *Q, struct TNode *node){
	printf("en-node-value:%d\n",node->value);
	struct QNode *nd=(struct QNode*)malloc(sizeof(struct QNode));
	nd->next=NULL;
	nd->p=node;
	Q->rear->next=nd;
	Q->rear=nd;
}

//出队列,注意判定快为空时,应有 rear=front
struct TNode* DeQueue(struct Queue *Q){
	struct QNode *p=Q->front->next;
	Q->front->next=Q->front->next->next;
	struct TNode *t=p->p;
	if(Q->rear==p){
		Q->rear=Q->front;
	}
	free(p);
	printf("de-node-value:%d\n",t->value);
	return t;
}

//建立二叉树
void createLR(struct TNode *node){
	if(node->value<20){
		struct TNode *n1=(struct TNode*)malloc(sizeof(struct TNode));
		struct TNode *n2=(struct TNode*)malloc(sizeof(struct TNode));
		node->left=n1;
		n1->value=node->value*2;
		node->right=n2;
		n2->value=node->value*2+1;	
		createLR(n1);
		createLR(n2);
	}else{
		node->left=NULL;
		node->right=NULL;
	}
}

//主程序
int main(int argc, char **argv){

	struct TNode *head=(struct TNode*)malloc(sizeof(struct TNode));
	head->value=1;
	createLR(head);

                //输出左、右边,测试树是否正确建立
	struct TNode *p=head;
	while(p){
		printf("%d\n",p->value);
		p=p->left;
	}
	p=head;
	while(p){
		printf("%d\n",p->value);
		p=p->right;
	}
	printf("\n");

                //用一个辅助的链队列,广度遍历树
	p=head;
	struct Queue *q;
	InitQueue(q);
	printf("%d\n",p->value);
	EnQueue(q,p);
	while(q->front->next!=NULL){
		p=DeQueue(q);
		if(p->left!=NULL){
			printf("%d\n",p->left->value);
			EnQueue(q,p->left);
		}
		if(p->right!=NULL){
			printf("%d\n",p->right->value);
			EnQueue(q,p->right);
		}
	}
	
                //以下代码没有别的意思,就是测试命令行参数
	int i=0;
	for(i=0; i<argc; i++){
		printf("%s\n",argv[i]);
	}

	return 0;
}

 

输出如下:

 

1
2
4
8
16
32
1
3
7
15
31

1
en-node-value:1
de-node-value:1
2
en-node-value:2
3
en-node-value:3
de-node-value:2
4
en-node-value:4
5
en-node-value:5
de-node-value:3
6
en-node-value:6
7
en-node-value:7
de-node-value:4
8
en-node-value:8
9
en-node-value:9
de-node-value:5
10
en-node-value:10
11
en-node-value:11
de-node-value:6
12
en-node-value:12
13
en-node-value:13
de-node-value:7
14
en-node-value:14
15
en-node-value:15
de-node-value:8
16
en-node-value:16
17
en-node-value:17
de-node-value:9
18
en-node-value:18
19
en-node-value:19
de-node-value:10
20
en-node-value:20
21
en-node-value:21
de-node-value:11
22
en-node-value:22
23
en-node-value:23
de-node-value:12
24
en-node-value:24
25
en-node-value:25
de-node-value:13
26
en-node-value:26
27
en-node-value:27
de-node-value:14
28
en-node-value:28
29
en-node-value:29
de-node-value:15
30
en-node-value:30
31
en-node-value:31
de-node-value:16
32
en-node-value:32
33
en-node-value:33
de-node-value:17
34
en-node-value:34
35
en-node-value:35
de-node-value:18
36
en-node-value:36
37
en-node-value:37
de-node-value:19
38
en-node-value:38
39
en-node-value:39
de-node-value:20
de-node-value:21
de-node-value:22
de-node-value:23
de-node-value:24
de-node-value:25
de-node-value:26
de-node-value:27
de-node-value:28
de-node-value:29
de-node-value:30
de-node-value:31
de-node-value:32
de-node-value:33
de-node-value:34
de-node-value:35
de-node-value:36
de-node-value:37
de-node-value:38
de-node-value:39
./test01

 

在 Linux 环境下练习,调试代码还有点不太习惯,VC6上可以的,在 Linux 中,却一定要要加 struct,如: struct QNode *nd ,其实还有点 bug,基本功能凑合用吧。

 

VM 下 Ubuntu 和 Windows 共享没解决,搭了三个环境,一样的方法,就这台不能共享,逼得只能用 Apache 服务器,以网页形式把代码拷贝出来,汗。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值