题目:
从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
基本思想:
遍历不是先序、中序、后序中的一种。
规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队里的末尾。接下来到队列的头部取出最早进入队列的节点,重复前面的打印操作。
#include <iostream>
#include <deque>
using namespace std;
//二叉树结点定义
typedef struct BiTreeNode{
int data;
//左右孩子指针
struct BiTreeNode *lchild;
struct BiTreeNode *rchild;
}BiTreeNode,*BiTree;
//按先序序列创建二叉树
int CreateBiTree(BiTree &T)
{
int data;
//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树
cin>>data;
if(data == -1)
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTreeNode));
T->data = data;//生成根结点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
return 0;
}
void foo(BiTree T)
{
if(!T)
return;
deque<BiTree> dequeTreeNode;
dequeTreeNode.push_back(T);
while(dequeTreeNode.size())
{
BiTree p = dequeTreeNode.front();//返回容器c的第一个元素的引用。如果c为空,则该操作为空
dequeTreeNode.pop_front();//删除头部数据
cout<<p->data<<" ";
if(p->lchild)
dequeTreeNode.push_back(p->lchild);
if(p->rchild)
dequeTreeNode.push_back(p->rchild);
}
}
void main()
{
BiTree T;
CreateBiTree(T);
foo(T);
}