同学电面被问到一个问题:如何获得完全二叉树的最后一个节点?二叉树以链表的形式存储。
没想到合适的办法,用广度遍历吧,最后一个节点就是了,代码如下:
#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 服务器,以网页形式把代码拷贝出来,汗。。。。
分享到:
相关推荐
二叉树的深度优先搜索与广度优先搜索实现 二叉树搜索是计算机科学中的一种常见的搜索算法,用于遍历二叉树中的所有...深度优先搜索可以用于查找二叉树中的某个节点,而广度优先搜索可以用于遍历二叉树中的所有节点。
在这个主题下,我们将深入探讨深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),以及在树结构中常见的先序、中序和后序遍历。这些遍历方法各有其特点,适用于不同的问题场景。...
本篇文章将深入探讨如何使用Java来实现二叉树的深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search)。 **深度优先遍历** 是一种在图或树中搜索的方法,它尽可能深地探索树的分支...
总结来说,非递归广度优先遍历二叉树是通过队列数据结构来实现的,它能够有效地按层次顺序访问所有节点,适用于各种需要按层次处理二叉树问题的场景。在C++编程中,理解和掌握这种实现方法对于提升算法能力及优化...
广度优先遍历作为一个初学者必备的技能,此资源免费,广度优先遍历是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名
本话题主要探讨如何使用非递归算法对无向图进行深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),这两种遍历方法在图算法中有着广泛的应用。 **1. 邻接表表示法** 在处理大...
二叉树的先序,中序,后序递归,非递归遍历和广度优先遍历。此程序是用C语言写的。
广度优先遍历(Breadth-First Traversal)是一种遍历二叉树的方法,它从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。 三、Java...
以下是一个使用BFS遍历二叉树的JS实现: ```javascript function bfs(root) { if (root === null) return; const queue = [root]; // 初始化队列,将根节点放入 while (queue.length > 0) { const currentNode...
二叉树遍历是计算机科学中处理树形结构数据时常用的一种操作,它分为深度优先搜索(DFS)和广度优先搜索(BFS)两种方式。本篇文章将重点关注广度优先搜索,即“二叉树遍历广度优先”。 广度优先搜索(BFS)是一种...
在这个压缩包中,包含了一个用C语言实现的程序,用于执行图的深度优先遍历(DFS, Depth-First Search)和广度优先遍历(BFS, Breadth-First Search)。以下是这两个遍历方法的详细解释: 1. **深度优先遍历(DFS)*...
二叉树遍历是访问二叉树中所有节点的一种方法,主要分为两种策略:深度优先遍历(DFS)和广度优先遍历(BFS)。这两种遍历方式在PHP中可以通过数据结构和算法实现。 **一、广度优先遍历(BFS)** 广度优先遍历的...
对于二叉树的广度优先遍历,可以将其看作是一种特殊的图,其中每个节点最多有两个子节点。同样,使用队列来实现: 1. **开始**:将根节点放入队列。 2. **循环**:在每次迭代中,取出队首元素(即当前层的第一个...
本资源主要探讨了二叉树的两种关键操作:广度优先遍历(Breadth-First Search, BFS)和节点插入操作。 首先,我们来理解二叉树的基本概念。二叉树是由节点构成的层次结构,每个节点最多有两个子节点,通常分为左子...
二叉树广度和深度优先遍历,通过递归算法实现二叉树的建立,利用递归算法实现深度优先遍历,使用队列实现广度优先遍历
二叉树的层数遍历(也称广度优先遍历)在C语言中通常使用队列实现。从根节点开始,将节点加入队列,然后循环处理队列中的节点,依次访问并将其左右子节点...这种方式逐层遍历二叉树,按层从上到下、从左到右访问节点。
本资料包主要探讨的是图的两种经典遍历方法:深度优先遍历(DFS,Depth-First Search)和广度优先遍历(BFS,Breadth-First Search)。 深度优先遍历是一种用于遍历或搜索树或图的算法,其基本思想是从起点开始,尽...
本话题将详细介绍两种主要的树遍历方法:深度优先遍历(DFS,Depth-First Search)和广度优先遍历(BFS,Breadth-First Search),并结合JavaScript语言进行阐述。 深度优先遍历是一种递归策略,它尽可能深地探索树...
以下是使用C语言编写的二叉树的广度优先遍历(也称为层次遍历)算法的示例代码: #include #include // 定义二叉树的节点结构 typedef struct Node { int data; struct Node* left; struct Node* right; } ...
图的遍历是图论中的基础操作,主要分为深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search)。这两种遍历方法在计算机科学中有着广泛的应用,比如在搜索算法、最短路径问题、网络...