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