算法实验 层序列表问题(二叉树)

来源:互联网 发布:杭州富谦网络 编辑:程序博客网 时间:2024/05/01 18:52

问题描述:对树中结点按层序列表是指先列树根,然后从左到右一次列出所有深度为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访问根结点,以便灵活完成相应的操作elseadd(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) ; }}      


0 1
原创粉丝点击