问题描写叙述:对树中结点按层序列表是指先列树根,然后从左到右一次列出全部深度为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) ; } }
时间: 2024-11-17 17:39:11