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