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

在本人“二叉树的基本操作”这篇博文中运用编程之美中的思想用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);


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值