層序遍歷二叉樹演算法
① 二叉樹的層次遍歷演算法
二叉樹的層次遍歷演算法有如下三種方法:
給定一棵二叉樹,要求進行分層遍歷,每層的節點值單獨列印一行,下圖給出事例結構:

之後大家就可以自己畫圖了,下面給出程序代碼:
[cpp] view plain
void print_by_level_3(Tree T) {
vector<tree_node_t*> vec;
vec.push_back(T);
int cur = 0;
int end = 1;
while (cur < vec.size()) {
end = vec.size();
while (cur < end) {
cout << vec[cur]->data << " ";
if (vec[cur]->lchild)
vec.push_back(vec[cur]->lchild);
if (vec[cur]->rchild)
vec.push_back(vec[cur]->rchild);
cur++;
}
cout << endl;
}
}
最後給出完成代碼的測試用例:124##57##8##3#6##
[cpp] view plain
#include<iostream>
#include<vector>
#include<deque>
using namespace std;
typedef struct tree_node_s {
char data;
struct tree_node_s *lchild;
struct tree_node_s *rchild;
}tree_node_t, *Tree;
void create_tree(Tree *T) {
char c = getchar();
if (c == '#') {
*T = NULL;
} else {
*T = (tree_node_t*)malloc(sizeof(tree_node_t));
(*T)->data = c;
create_tree(&(*T)->lchild);
create_tree(&(*T)->rchild);
}
}
void print_tree(Tree T) {
if (T) {
cout << T->data << " ";
print_tree(T->lchild);
print_tree(T->rchild);
}
}
int print_at_level(Tree T, int level) {
if (!T || level < 0)
return 0;
if (0 == level) {
cout << T->data << " ";
return 1;
}
return print_at_level(T->lchild, level - 1) + print_at_level(T->rchild, level - 1);
}
void print_by_level_1(Tree T) {
int i = 0;
for (i = 0; ; i++) {
if (!print_at_level(T, i))
break;
}
cout << endl;
}
void print_by_level_2(Tree T) {
deque<tree_node_t*> q_first, q_second;
q_first.push_back(T);
while(!q_first.empty()) {
while (!q_first.empty()) {
tree_node_t *temp = q_first.front();
q_first.pop_front();
cout << temp->data << " ";
if (temp->lchild)
q_second.push_back(temp->lchild);
if (temp->rchild)
q_second.push_back(temp->rchild);
}
cout << endl;
q_first.swap(q_second);
}
}
void print_by_level_3(Tree T) {
vector<tree_node_t*> vec;
vec.push_back(T);
int cur = 0;
int end = 1;
while (cur < vec.size()) {
end = vec.size();
while (cur < end) {
cout << vec[cur]->data << " ";
if (vec[cur]->lchild)
vec.push_back(vec[cur]->lchild);
if (vec[cur]->rchild)
vec.push_back(vec[cur]->rchild);
cur++;
}
cout << endl;
}
}
int main(int argc, char *argv[]) {
Tree T = NULL;
create_tree(&T);
print_tree(T);
cout << endl;
print_by_level_3(T);
cin.get();
cin.get();
return 0;
}
② 以二叉連表做存儲結構,試編寫按層次順序遍歷二叉樹的演算法
//二叉樹,按層次訪問
//引用如下地址的思想,設計一個演算法層序遍歷二叉樹(同一層從左到右訪問)。思想:用一個隊列保存被訪問的當前節點的左右孩子以實現層序遍歷。
//http://..com/link?url=a9ltidaf-SQzCIsa
typedef struct tagMyBTree
{
    int data;
    struct tagMyBTree *left,*right;
}MyBTree;
void visitNode(MyBTree *node)
{
    if (node)
    {
        printf("%d ", node->data);
    }
    
}
void visitBTree(queue<MyBTree*> q);
void createBTree(MyBTree **tree)
{
    int data = 0;
    static int initdata[15] = {1,2,4,0,0,5,0,0,3,6,0,0,7,0,0};//構造成滿二叉樹,利於查看結果
    static int i = 0;
    //scanf("%d", &data);
    data = initdata[i++];
    if (data == 0)
    {
        *tree = NULL;
    }
    else
    {
        *tree = (MyBTree*)malloc(sizeof(MyBTree));
        if (*tree == NULL)
        {
            return;
        }
        (*tree)->data = data;
        
        createBTree(&(*tree)->left);
        
        createBTree(&(*tree)->right);
        
    }
}
void visitBTreeTest()
{
    queue<MyBTree*> q;
    MyBTree *tree;
    createBTree(&tree);
    q.push(tree);
    visitBTree(q);
}
void visitBTree(queue<MyBTree*> q)
{
    if (!q.empty())
    {
        MyBTree *t = q.front();
        q.pop();
        visitNode(t);
        if (t->left)
        {
            q.push(t->left);
        }
        if (t->right)
        {
            q.push(t->right);
        }
        visitBTree(q);
    }
}
③ 二叉樹層次遍歷演算法
#include<stdio.h> 
#include<stdlib.h> 
typedef char datatype; 
typedef struct node 
{datatype data; 
struct node *lchild,*rchild; 
}bitree; 
bitree *Q[100]; 
bitree *creat() 
{ 
bitree *root,*s; 
int front,rear; 
root=NULL; 
char ch; 
front=1;rear=0; 
ch=getchar(); 
while(ch!='0') 
{ 
s=NULL; 
if(ch!='@') 
{s=(bitree *)malloc(sizeof(bitree)); 
s->data=ch; 
s->lchild=NULL; 
s->rchild=NULL; 
} 
rear++; 
Q[rear]=s; 
if(rear==1) 
root=s; 
else 
{ 
if(s&&Q[front]) 
if(rear%2==0) 
Q[front]->lchild=s; 
else 
Q[front]->rchild=s; 
if(rear%2==1) 
front++; 
} 
ch=getchar(); 
} 
return root; 
} 
void cengci(bitree *t) 
{ 
bitree *Queue[100],*p; 
int front=0,rear=0; 
if(t) 
{ 
p=t; 
Queue[rear]=p; 
rear=(rear+1)%20; 
while(front!=rear) 
{ 
p=Queue[front]; 
printf("%c",p->data); 
front=(front+1)%100; 
if(p->lchild) 
{ 
Queue[rear]=p->lchild; 
rear=(rear+1)%100; 
} 
if(p->rchild) 
{ 
Queue[rear]=p->rchild; 
rear=(rear+1)%20; 
} 
} 
} 
} 
void main() 
{struct node *tree; 
tree=(bitree *)malloc(sizeof(bitree)); 
tree=creat(); 
cengci(tree); 
}
④ 二叉樹層次遍歷怎麼進行
設計一個演算法層序遍歷二叉樹(同一層從左到右訪問)。思想:用一個隊列保存被訪問的當前節點的左右孩子以實現層序遍歷。
void HierarchyBiTree(BiTree Root){
LinkQueue *Q; // 保存當前節點的左右孩子的隊列
InitQueue(Q); // 初始化隊列
if (Root == NULL) return ; //樹為空則返回
BiNode *p = Root;          // 臨時保存樹根Root到指針p中
Visit(p->data);      // 訪問根節點
if (p->lchild)        EnQueue(Q, p->lchild);   // 若存在左孩子,左孩子進隊列
if (p->rchild)         EnQueue(Q, p->rchild); // 若存在右孩子,右孩子進隊列
while (!QueueEmpty(Q)) // 若隊列不空,則層序遍歷      {                                DeQueue(Q, p); // 出隊列
Visit(p->data);// 訪問當前節點
if (p->lchild)                EnQueue(Q, p->lchild); // 若存在左孩子,左孩子進隊列
if (p->rchild)                EnQueue(Q, p->rchild); // 若存在右孩子,右孩子進隊列
}
DestroyQueue(Q);                // 釋放隊列空間
return ;
這個已經很詳細了!你一定可以看懂的!加油啊!
⑤ 二叉樹層次遍歷
/**
*層序遍歷
*/
voidLevelOrderTraversal(BinTree*BT){
BinTree*T;
T=BT;
if(!T){
return;
}
Queue*Q=InitQueue(); /*生成一個隊列*/
EnQueue(Q,T); /*根節點入隊*/
while(!IsQueueEmpty(Q)){ /*隊列不為空,彈出一個元素*/
T=DeQueue(Q);
Visited(T); /*訪問*/
if(T->Left) /*左子樹不為空入隊*/
EnQueue(Q,T->Left);
if(T->Right) /*右子樹不為空入隊*/
EnQueue(Q,T->Right);
}
}
你的代碼貌似不對,原因是:你只是把根節點進了隊列!看看我寫的!
同時你也可以直接用網路搜索「C實現二叉樹(模塊化集成,遍歷的遞歸與非遞歸實現)」,這是博客園的一個博文,裡面有關二叉樹的前中後層遍歷的遞歸與非遞歸演算法,比較全面。
⑥ 層序遍歷二叉樹
#include<stdio.h>
#include<stdlib.h>
#define  m 100
typedef char etype;
typedef struct bitnode
{
etype data;
struct bitnode *lch,*rch;
}bitnode,*bitree;
bitree que[m];
int front=0,rear=0;
bitnode *creat_bt1();
bitnode *creat_bt2();
void preorder(bitnode *p);
void inorder(bitnode *p);
void postorder(bitnode *p);
void enqueue(bitree);
bitree delqueue();
void levorder(bitree);
int treedepth(bitree);
void prtbtree(bitree,int);
void exchange(bitree);
int leafcount(bitree);
void paintleaf(bitree);
bitnode *t;
int count=0;
void main()
{
char ch;int k;
do{
	printf("\n\n\n");
printf("\n==========主菜單==============");
printf("\n  1.建立二叉樹方法 1");
printf("\n  2.建立二叉樹方法 2");
printf("\n  3.先序遞歸遍歷二叉樹");
printf("\n  4.中序遞歸遍歷二叉樹");
printf("\n  5.後序遞歸遍歷二叉樹");
printf("\n  6.層次遍歷二叉樹");
printf("\n  7.計算二叉樹的高度");
printf("\n  8.計算二叉樹中葉結點個數");
printf("\n  9.交換二叉樹的左右子樹");
printf("\n  10.列印二叉樹");
printf("\n  0.結束程序運行");
printf("\n===============================");
printf("\n  請輸入您的選擇(0,1,2,3,4,5,6,7,8,9,10)");
scanf("%d",&k);
switch(k)
{case 1:t=creat_bt1();break;
 case 2:printf("\n請輸入二叉樹各節點的值:");fflush(stdin);
	   t=creat_bt2();break;
 case 3:if(t)
	   {printf("先序遍歷二叉樹:");
	   preorder(t);
	   printf("\n");
	   }
	   else printf("二叉樹為空!\n");
	   break;
case 4:if(t)
	   {printf("中序遍歷二叉樹:");
	   inorder(t);
	   printf("\n");
	   }
	   else printf("二叉樹為空!\n");
	   break;
case 5:if(t)
	   {printf("後序遍歷二叉樹:");
	   postorder(t);
	printf("\n");
	   }
	else printf("二叉樹為空!\n");
	break;
case 6:if(t)
	   {printf("層次遍歷二叉樹:");
	   levorder(t);
	printf("\n");
	   }
	else printf("二叉樹為空!\n");
	break;
case 7:if(t)
	   {printf("二叉樹的高度為:%d",treedepth(t));
	printf("\n");
	   }
	else printf("二叉樹為空!\n");
	break;
case 8:if(t)
	   {printf("二叉樹的葉子結點數為:%d\n",leafcount(t));
	    printf("二叉樹的葉結點數為:");paintleaf(t);
		printf("\n");
	   }
	else printf("二叉樹為空!\n");
	break;
case 9:if(t)
	   {printf("二叉樹的左右子樹:\n");
	    exchange(t);
		prtbtree(t,0);
		printf("\n");
	   }
	else printf("二叉樹為空!\n");
	break;
case 10:if(t)
        {printf("逆時針旋轉90度輸出的二叉樹:\n");
		prtbtree(t,0);
		printf("\n");
		}
	else printf("二叉樹為空!\n");
	break;
case 0:exit(0);
		}
}while(k>=1&&k<=10);
      printf("\n再見! 按回車鍵,返回…\n");
	  ch=getchar();
}
bitnode *creat_bt1()
{
bitnode *t,*p,*v[20];int i,j;etype e;
printf("\n請輸入二叉樹各結點的編號和對應的值(如:1,a):");
scanf("%d,%c",&i,&e);
while(i!=0&&e!='#')
{
p=(bitnode *)malloc(sizeof(bitnode));
p->data=e;p->lch=NULL;p->rch=NULL;
v[i]=p;
if(i==1)t=p;
else
{j=i/2;
if(i%2==0) v[j]->lch=p;
else
v[j]->rch=p;
}
printf("\n 請繼續輸入二叉樹各結點的編號和對應的值:");
scanf("%d,%c",&i,&e);
}
return(t);
}
bitnode *creat_bt2()
{
bitnode *t;etype e;
scanf("%c",&e);
if(e=='#')
t=NULL;
else
{
t=(bitnode *)malloc(sizeof(bitnode));
t->data=e;
t->lch=creat_bt2();
t->rch=creat_bt2();
}
return(t);
}
void preorder(bitnode *p){
if(p)
{
printf("%3c",p->data);
preorder(p->lch);
preorder(p->rch);
}
}
void inorder(bitnode *p)
{
	if(p){
	
	inorder(p->lch);
	printf("%3c",p->data);
	inorder(p->rch);	
	}
}
void postorder(bitnode *p)
{
if(p)
{
postorder(p->lch);
postorder(p->rch);
printf("%3c",p->data);
}
}
void enqueue(bitree T)
{
if(front!=(rear+1)%m)
{rear=(rear+1)%m;
que[rear]=T;}
}
bitree delqueue()
{
if(front==rear)return NULL;
front=(front+1)%m;
return(que[front]);
}
void levorder(bitree T)
{
	bitree p;
	if(T)
	{
	enqueue(T);
	while(front!=rear)
	{
	p=delqueue();
	printf("%3c",p->data);
	if(p->lch!=NULL)enqueue(p->lch);
	if(p->rch!=NULL)enqueue(p->rch);
	}	
    }
}
int treedepth(bitree bt)
{
int hl,hr,max;
if(bt!=NULL)
{
hl=treedepth(bt->lch);
hr=treedepth(bt->rch);
max=(hl>hr)? hl:hr;
return(max+1);
}
else
return(0);
}
void prtbtree(bitree bt,int level)
{
int j;
if(bt){
prtbtree(bt->rch,level+1);
for(j=0;j<=6*level+1;j++)printf("  ");
printf("%c\n",bt->data);
prtbtree(bt->lch,level+1);
}
}
void exchange(bitree bt)
{
bitree p;
if(bt)
{p=bt->lch;bt->lch=bt->rch;bt->rch=p;
exchange(bt->lch);exchange(bt->rch);
}
}
int leafcount(bitree bt)
{
if(bt!=NULL)
{
leafcount(bt->lch);
leafcount(bt->rch);
if((bt->lch==NULL)&&(bt->rch==NULL))
count++;
}
return(count);
}
void paintleaf(bitree bt)
{
if(bt!=NULL)
{
if(bt->lch==NULL&&bt->rch==NULL)
printf("%3c",bt->data);
paintleaf(bt->lch);
paintleaf(bt->rch);
}
}
⑦ 二叉樹的層次遍歷
設計一個演算法層序遍歷二叉樹(同一層從左到右訪問)。思想:用一個隊列保存被訪問的當前節點的左右孩子以實現層序遍歷。
void HierarchyBiTree(BiTree Root){
LinkQueue *Q; // 保存當前節點的左右孩子的隊列
InitQueue(Q); // 初始化隊列
if (Root == NULL) return ; //樹為空則返回
BiNode *p = Root;          // 臨時保存樹根Root到指針p中
Visit(p->data);      // 訪問根節點
if (p->lchild)        EnQueue(Q, p->lchild);   // 若存在左孩子,左孩子進隊列
if (p->rchild)         EnQueue(Q, p->rchild); // 若存在右孩子,右孩子進隊列
while (!QueueEmpty(Q)) // 若隊列不空,則層序遍歷      {                                DeQueue(Q, p); // 出隊列
Visit(p->data);// 訪問當前節點
if (p->lchild)                EnQueue(Q, p->lchild); // 若存在左孩子,左孩子進隊列
if (p->rchild)                EnQueue(Q, p->rchild); // 若存在右孩子,右孩子進隊列
}
DestroyQueue(Q);                // 釋放隊列空間
return ;
這個已經很詳細了!你一定可以看懂的!加油啊!
⑧ 如何用c語言實現層次遍歷二叉樹
下面是c語言的前序遍歷二叉樹的演算法,在這里假設的節點元素值假設的為字元型,
說明:演算法中用到了結構體,也用到了遞歸的方法,你看看怎麼樣,祝你好運!
#include"stdio.h"
typedef
char
elemtype;
typedef
struct
node
//定義鏈表結構
{
elemtype
data;
//定義節點值
struct
note
*lchild;
//定義左子節點值
struct
note
*rchild;
//定義右節點值
}btree;
preorder(btree
*root)
//前序遍歷
{
if(roof!=null)
//如果不是空節點
{
printf("%c\n",root->data);
//輸出當前節點
preorder(root->lchild);
//遞歸前序遍歷左子節點
preorder(root->rchild);
//遞歸前序遍歷右子節點
}
return;
//結束
}
⑨ 二叉樹的層次遍歷以及用層次遍歷演算法顯示所有葉子節點
#include <iostream>
using namespace std;
struct segtree{int a,b;} tree[10001];
void buildtree(int l,int r,int root = 0) //建樹 {	tree[root].a=l;	tree[root].b=r;	if (l==r)		return;	int mid=(l+r)>>1;	root<<=1;	buildtree(l,mid,root+1);	buildtree(l,mid,root+2);}
void dfs(int level,int root = 0){	for (int i=1;i<level;i++)		cout<<' ';	cout<<"Lv"<<level<<" : ["<<tree[root].a<<","<<tree[root].b<<"]\n";	if (tree[root].a!=tree[root].b)	{		root<<=1;		dfs(level+1,root+1);		dfs(level+1,root+2);	}}
struct {int root,level;} st[100001];
void bfs(){	int top=1,first=0;	st[first].root=0;	st[first].level=1;	while (first<top)	{		for (int i=st[first].level;i>1;i--)			cout<<' ';		cout<<"Lv"<<st[first].level<<" : ["<<tree[st[first].root].a<<","<<tree[st[first].root].b<<"]\n";		if (tree[st[first].root].a!=tree[st[first].root].b)		{			st[top].root=st[first].root*2+1;			st[top++].level=st[first].level+1;			st[top].root=st[first].root*2+2;			st[top++].level=st[first].level+1;		}		first++;	}}
int main(){	int t,i;	cout<<"以[1,9]線段樹為例,生成一個二叉樹。\n\n";	buildtree(1,9);	cout<<"以深度遍歷該樹(深搜):\n";	dfs(1);	cout<<"以深度遍歷該樹(寬搜):\n";	bfs();	system("pause");	return 0;}
⑩ 編寫按層次順序(同一層從左至右)遍歷二叉樹的演算法
#include<stdio.h> 
#include<stdlib.h> 
typedef char datatype; 
typedef struct node 
{datatype data; 
struct node *lchild,*rchild; 
}bitree; 
bitree *Q[100]; 
bitree *creat() 
{ 
bitree *root,*s; 
int front,rear; 
root=NULL; 
char ch; 
front=1;rear=0; 
ch=getchar(); 
while(ch!='0') 
{ 
s=NULL; 
if(ch!='@') 
{s=(bitree *)malloc(sizeof(bitree)); 
s->data=ch; 
s->lchild=NULL; 
s->rchild=NULL; 
} 
rear++; 
Q[rear]=s; 
if(rear==1) 
root=s; 
else 
{ 
if(s&&Q[front]) 
if(rear%2==0) 
Q[front]->lchild=s; 
else 
Q[front]->rchild=s; 
if(rear%2==1) 
front++; 
} 
ch=getchar(); 
} 
return root; 
} 
void cengci(bitree *t) 
{ 
bitree *Queue[100],*p; 
int front=0,rear=0; 
if(t) 
{ 
p=t; 
Queue[rear]=p; 
rear=(rear+1)%20; 
while(front!=rear) 
{ 
p=Queue[front]; 
printf("%c",p->data); 
front=(front+1)%100; 
if(p->lchild) 
{ 
Queue[rear]=p->lchild; 
rear=(rear+1)%100; 
} 
if(p->rchild) 
{ 
Queue[rear]=p->rchild; 
rear=(rear+1)%20; 
} 
} 
} 
} 
void main() 
{struct node *tree; 
tree=(bitree *)malloc(sizeof(bitree)); 
tree=creat(); 
cengci(tree); 
} 
遍歷方法從void cengci(bitree *t) 開始的 用隊列方法遍歷的
