问题描写叙述:对树中结点按层序列表是指先列树根,然后从左到右一次列出全部深度为1的节点,再从做到右地列出深度为2的节点,等等。层序列表问题要求对一颗给定的二叉树按层序列表。
数据输入:第一行为一个整数n,表示给定的二叉树有n个顶点。接下来的n行中,每行有3个整数a,b,c 分别表示编号为a的节点的左儿子b和右儿子c。
5
1 4 2
4 3 0
2 5 0
3 0 0
5 0 0
output:
1 4 2 3 5
代码:
#include<iostream>
#include<queue>
using namespace std;
//全局变量
int t1,t2,t3;
typedef struct BTNode
{
int data ;
struct BTNode *Lchild , *Rchild ;
}BTNode ;
queue<BTNode *> q;
void *Preorder_Create_BTree(BTNode *&T,int k);
void InOrder(BTNode *t);
void InOrder(BTNode *t);
void add(BTNode *&t,int m)
{
if (t){ // T=NULL时,二叉树为空树,不做不论什么操作
if(t->data == m)//符合条件,则进行左孩子和右孩子加入
{
Preorder_Create_BTree(t->Lchild,t2);
Preorder_Create_BTree(t->Rchild,t3);
}// 通过函数指针*visit訪问根结点,以便灵活完毕对应的操作
else
add(t->Lchild,m); // 中序遍历左子树
add(t->Rchild,m); // 中序遍历右子树
}
}
/*
//前序遍历
void InOrder(BTNode *t)
{
if (t){ // T=NULL时,二叉树为空树,不做不论什么操作
cout<<t->data<<" "; // 通过函数指针*visit訪问根结点,以便灵活完毕对应的操作
InOrder(t->Lchild); // 中序遍历左子树
InOrder(t->Rchild); // 中序遍历右子树
}
}
*/
//层序遍历
void levelOrder(BTNode *t)
{
BTNode *k;
q.push(t);
while(!q.empty())
{
k = q.front();
q.pop();
cout<<k->data<<" ";
if(k->Lchild) q.push(k->Lchild);
if(k->Rchild) q.push(k->Rchild);
}
}
int main()
{ int n,i,flag= 1;
BTNode * bt;
Preorder_Create_BTree(bt,0);
cin>>n;
for(i=0;i<n;i++)
{
cin>>t1>>t2>>t3;
if(flag)//第一次应该先加入节点
{
Preorder_Create_BTree(bt,t1);
Preorder_Create_BTree(bt->Lchild,t2);
Preorder_Create_BTree(bt->Rchild,t3);
flag = 0;
}
//
else//之后每加入一次须要再遍历二叉树,符合条件然后加入
add(bt,t1);
}
// cout<<"中序遍历:";
// InOrder(bt);
// cout<<endl;
levelOrder(bt);
return 0;
}
void *Preorder_Create_BTree(BTNode *&T,int k)
/* 建立链式二叉树,返回指向根结点的指针变量 */
{
// char ch ;
// ch=getchar() ;
if (k==0)
{
T=NULL;
return(T) ;
}
else
{
T=(BTNode *)malloc(sizeof(BTNode)) ;
T->data=k;
Preorder_Create_BTree(T->Lchild,0) ;
Preorder_Create_BTree(T->Rchild,0) ;
}
}