`
leidiqiu
  • 浏览: 135100 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

广度优先遍历二叉树

阅读更多

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

 

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

 

#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 服务器,以网页形式把代码拷贝出来,汗。。。。

0
0
分享到:
评论

相关推荐

    二叉树的深度优先搜索与广度优先搜索实现

    二叉树的深度优先搜索与广度优先搜索实现 二叉树搜索是计算机科学中的一种常见的搜索算法,用于遍历二叉树中的所有...深度优先搜索可以用于查找二叉树中的某个节点,而广度优先搜索可以用于遍历二叉树中的所有节点。

    图的遍历,包括深度优先和广度优先遍历

    在这个主题下,我们将深入探讨深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),以及在树结构中常见的先序、中序和后序遍历。这些遍历方法各有其特点,适用于不同的问题场景。...

    用Java实现二叉树的深度优先、广度优先遍历

    本篇文章将深入探讨如何使用Java来实现二叉树的深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search)。 **深度优先遍历** 是一种在图或树中搜索的方法,它尽可能深地探索树的分支...

    非递归实现广度遍历生成二叉树

    总结来说,非递归广度优先遍历二叉树是通过队列数据结构来实现的,它能够有效地按层次顺序访问所有节点,适用于各种需要按层次处理二叉树问题的场景。在C++编程中,理解和掌握这种实现方法对于提升算法能力及优化...

    广度优先遍历 实例

    广度优先遍历作为一个初学者必备的技能,此资源免费,广度优先遍历是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名

    Graph1_非递归算法进行深度优先遍历和广度优先遍历_

    本话题主要探讨如何使用非递归算法对无向图进行深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),这两种遍历方法在图算法中有着广泛的应用。 **1. 邻接表表示法** 在处理大...

    二叉树的先序,中序,后序递归,非递归遍历和广度优先遍历。

    二叉树的先序,中序,后序递归,非递归遍历和广度优先遍历。此程序是用C语言写的。

    Java实现二叉树的深度优先遍历和广度优先遍历算法示例

    广度优先遍历(Breadth-First Traversal)是一种遍历二叉树的方法,它从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。 三、Java...

    js代码-二叉树广度优先遍历

    以下是一个使用BFS遍历二叉树的JS实现: ```javascript function bfs(root) { if (root === null) return; const queue = [root]; // 初始化队列,将根节点放入 while (queue.length &gt; 0) { const currentNode...

    二叉树遍历广度优先

    二叉树遍历是计算机科学中处理树形结构数据时常用的一种操作,它分为深度优先搜索(DFS)和广度优先搜索(BFS)两种方式。本篇文章将重点关注广度优先搜索,即“二叉树遍历广度优先”。 广度优先搜索(BFS)是一种...

    图的深度、广度优先遍历(c语言).rar

    在这个压缩包中,包含了一个用C语言实现的程序,用于执行图的深度优先遍历(DFS, Depth-First Search)和广度优先遍历(BFS, Breadth-First Search)。以下是这两个遍历方法的详细解释: 1. **深度优先遍历(DFS)*...

    PHP实现二叉树的深度优先与广度优先遍历方法

    二叉树遍历是访问二叉树中所有节点的一种方法,主要分为两种策略:深度优先遍历(DFS)和广度优先遍历(BFS)。这两种遍历方式在PHP中可以通过数据结构和算法实现。 **一、广度优先遍历(BFS)** 广度优先遍历的...

    图的广度优先遍历

    对于二叉树的广度优先遍历,可以将其看作是一种特殊的图,其中每个节点最多有两个子节点。同样,使用队列来实现: 1. **开始**:将根节点放入队列。 2. **循环**:在每次迭代中,取出队首元素(即当前层的第一个...

    算法-数据结构和算法-17-二叉树的广度优先遍历和二叉树节点插入操作.rar

    本资源主要探讨了二叉树的两种关键操作:广度优先遍历(Breadth-First Search, BFS)和节点插入操作。 首先,我们来理解二叉树的基本概念。二叉树是由节点构成的层次结构,每个节点最多有两个子节点,通常分为左子...

    二叉树广度和深度优先遍历

    二叉树广度和深度优先遍历,通过递归算法实现二叉树的建立,利用递归算法实现深度优先遍历,使用队列实现广度优先遍历

    二叉树的层数遍历(广度优先遍历)

    二叉树的层数遍历(也称广度优先遍历)在C语言中通常使用队列实现。从根节点开始,将节点加入队列,然后循环处理队列中的节点,依次访问并将其左右子节点...这种方式逐层遍历二叉树,按层从上到下、从左到右访问节点。

    数据结构 图的深度优先遍历和广度优先遍历 .zip

    本资料包主要探讨的是图的两种经典遍历方法:深度优先遍历(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)。这两种遍历方法在计算机科学中有着广泛的应用,比如在搜索算法、最短路径问题、网络...

Global site tag (gtag.js) - Google Analytics