运用队列实现二叉树的按层遍历

在本人“二叉树的基本操作”这篇博文中运用编程之美中的思想用vector实现二叉树的按层遍历但是老感觉不是很好这次我又用法deque以队列的方式在此实现了层次遍历微笑和大家分享一下。

首先说明一下思想:

1,构造二叉树:个人该觉向书上的那种构造太麻烦,所以我选择了二叉排序树的那种构造方法(当然没有经过旋转也就是说不是AVL或者红黑树)。

2,遍历,先将给节点入队列,然后在出队列之前先将其两个孩子入队列,这样遍历整个树就OK

构造好的二叉树如上图。

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

using namespace std;

typedef struct BiTnode
{
	int data;
	struct BiTnode *lchild, *rchild;
	
} BiTnode, *BiTree;

BiTree SearchBST(BiTree T, int key)
{
	BiTree q,p,position=NULL;
	p =q= T;

	while(p != NULL)
	{
		q = p;
	
	 if(key == p->data)	
	 {
		 printf("存在相等值");
		 exit(0);
	 }

	 else if(key > p->data)
		p = p->rchild;
	 else
		p = p->lchild;
	}
	
	position = q;
    return position;
	
}


void  insertBST(BiTree &T, int key)
{
	BiTree p,s;
	p = SearchBST(T,key);

	s = (BiTree) malloc(sizeof(BiTnode));
	s->data = key;
	s->lchild = s->rchild = NULL;
		
	if(!p)
		T = s;
	else if( key < p->data)
		p->lchild = s;
	else
		p->rchild = s;
}


void bianli( BiTree T )
{
	if(T==NULL)
		return ;
	bianli(T->lchild);
	printf("%d ",T->data);
	bianli(T->rchild);
}

void LevelTraversal(BiTree T)
{
	deque<BiTree>d;
	BiTree ptr = T;
	deque<BiTree>::iterator iter;
	if(T!=NULL)
    	d.push_back(ptr);
	while(d.size()!=0)
	{
		iter = d.begin();  //获取队列头部元素
		cout<<(*iter)->data<<endl;
		if((*iter)->lchild != NULL)
			d.push_back((*iter)->lchild);  //左孩子入队
		if((*iter)->rchild!=NULL)
			d.push_back((*iter)->rchild);  //右孩子入队
		d.pop_front();  //队首元素出队列
	}
}


void main()
{
	
	int i;
	int a[11] = {62, 88, 58, 47,35,73,51,99,37,93,100};
	BiTree T = NULL;
	for(i = 0; i < 11; i++)
	{
		insertBST( T,a[i]);     //构造二叉树
	}
//	bianli(T); 
	LevelTraversal(T);


}


在 C 语言中实现二叉树按层遍历,通常采用队列(Queue)数据结构,因为队列的特性正好适合这种逐层访问的顺序。这里提供一个基于广度优先搜索(BFS)的简单实现: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 创建一个新的二叉树节点 TreeNode* newNode(int val) { TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } // 按层遍历函数 void levelOrderTraversal(TreeNode* root) { if (root == NULL) return; // 初始化队列并添加根节点 Queue queue; enqueue(&queue, root); while (!isQueueEmpty(&queue)) { // 弹出队首元素 TreeNode* temp = dequeue(&queue); // 输出当前节点值 printf("%d ", temp->val); // 如果有左、右子节点,添加到队列中 if (temp->left != NULL) enqueue(&queue, temp->left); if (temp->right != NULL) enqueue(&queue, temp->right); } } // 队列操作,这里假设已经定义了enqueue和dequeue函数 void enqueue(Queue* queue, TreeNode* node) { // ... } int isQueueEmpty(Queue* queue) { // ... } // 主函数示例 int main() { // 构建二叉树(例如:创建一个简单的二叉树) TreeNode* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); printf("Level order traversal of the binary tree: "); levelOrderTraversal(root); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值