同学电面被问到一个问题:如何获得完全二叉树的最后一个节点?二叉树以链表的形式存储。
没想到合适的办法,用广度遍历吧,最后一个节点就是了,代码如下:
#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 服务器,以网页形式把代码拷贝出来,汗。。。。
1910

被折叠的 条评论
为什么被折叠?



