当前位置:首页 » 操作系统 » 二叉树的层次遍历算法

二叉树的层次遍历算法

发布时间: 2022-03-14 02:23:21

① 实现二叉树的层次遍历用c语言!不要c++

很完整的层次遍历,就不贴代码了。
http://wenku..com/view/820bfffb04a1b0717fd5dde8.html?st=1

② 二叉树的层次遍历是递归的算法

层次遍历从方法上不具有递归的形式,所以一般不用递归实现。当然了,非要写成递归肯定也是可以的,大致方法如下。 void LevelOrder(BTree T, int cnt) { BTree level = malloc(sizeof(struct BTNode)*cnt); if(level==NULL) return; int i=0,rear=0; if(cnt==0) return; for(i=0; i<cnt; i++){ printf("%c ",T[i].data); if(T[i].lchild) level[rear++]=*T[i].lchild; if(T[i].rchild) level[rear++]=*T[i].rchild; } printf("\n"); LevelOrder(level, rear); free(level); } 补充一下,在main里面调用的时候就得用LevelOrder(T,1)了。

③ 二叉树层次遍历算法

#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);
}

④ 二叉树的层次遍历以及用层次遍历算法显示所有叶子节点

#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;}

⑤ 以二叉连表做存储结构,试编写按层次顺序遍历二叉树的算法

//二叉树,按层次访问
//引用如下地址的思想,设计一个算法层序遍历二叉树(同一层从左到右访问)。思想:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。
//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);
}
}

⑥ 编写算法实现对二叉树进行按层次遍历

void Levelorder(BiTree T)
{
int front=0,rear=1;
BiTree q[50];
q[0]=T;
while(front<rear)
{
if(q[front])
{
cout<<q[front]->data<<" ";
q[rear++]=q[front]->lchild;
q[rear++]=q[front]->rchild;
front++;

}
else
front++;
}
cout<<endl;
}

⑦ 二叉树层次遍历怎么进行

设计一个算法层序遍历二叉树(同一层从左到右访问)。思想:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。
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 ;
这个已经很详细了!你一定可以看懂的!加油啊!

⑧ 求二叉树的层次遍历代码,求高手!!!

#include "stdio.h"typedef int Datatype#define MAXNODE 100
//二叉链表的存储typedef struct BiTNode { Datatype data; struct BiTNode *lchild,*rchild;//左右孩子指针}BiTreeNode,*BiTree;
//三叉链表的存储typedef struct BiTNode { Datatype data; struct BiTNode *lchild,*rchild,*parent;}BiTreeNode,*BiTree;
//算法3.1:二叉树的先序遍历递归算法void PreOrder(BiTree bt){ if(bt!=NULL){ visit(bt->data);//访问根结点 PreOrder(bt->lchild); PreOrder(bt->rchild); }}
//算法3.2:二叉树的中序遍历递归算法void InOrder(BiTree bt){ if(bt!=NULL){ InOrder(bt->lchild); visit(bt->data); InOrder(bt->rchild); }}
//算法3.3:二叉树的后序遍历递归算法void InOrder(BiTree bt){ if(bt!=NULL){ InOrder(bt->lchild); InOrder(bt->rchild); visit(bt->data); }}
//算法3.4:二叉树的层次遍历算法void LevelOrder(BiTree bt){ BiTreeNode Queue[MAXNODE]; //定义队列 int front,rear; if(bt==NULL) return //空二叉树,遍历结束 front=-1; rear=0; Queue[rear]=bt; //根结点入队 while(rear!=front){ //队列不空,继续遍历;否则,遍历结束 front++; //出队 visit(Queue[front]->data); //访问刚出队的元素 if(Queue[front]->lchild!=NULL){ //如果有左孩子,左孩子入队 rear++; Queue[rear]=Queue[front]->lchild; } if(Queue[front]->rchild!=NULL){ //如果有右孩子,右孩子入队 rear++; Queue[rear]=Queue[front]->rchild; } }}
//算法3.5:中序遍历的非递归算法void NRInOrder(BiTree bt){ BiTree S[MAXNODE],p=bt;//定义栈 int top=-1; if(bt==NULL) return;//空二叉树,遍历结束 while(!(p==NULL&&top==0)){ while(p!=NULL){ if(top<MAXNODE-1) S[top++]=p;//当前指针p入栈 else{printf("栈溢出\n");return;} p=p->lchild;//指针指向p的左孩子结点 } if(top==-1) return //栈空,结束 else{ p=S[--top];//弹出栈顶元素 visit(p->data);//访问结点的数据域 p=p->rchild;//指向p的右孩子结点 } }}

//算法3.6:根据先序与中序遍历结果建立二叉树void PreInOrd(char preord[],char inord[],int i,int j,int k,int h,BiTree *t)//先序序列从i到j,中序序列从k到h,建立一个二叉树放到t中{ int m; (*t)=new BTNode; (*t)->data=preord[i];//二叉树的根 m=k; while (i[m]!=preord[i])m++;//在中序序列中定位树根 /********递归调用建立左子树******/ if(m==k)(*t)->left=NULL; else PreInOrd(preord,inord,i+1,i+m-k,k,m-1,&(*t)->left); /********递归调用建立左子树******/ if(m==k)(*t)->right=NULL; else PreInOrd(preord,inord,i+1,i+m-k,k,m-1,&(*))->right);}BTree * createBT(char preord[],char inord[],int n,BTree root)//n为二叉树接点的个数,建立的二叉树放在root中{ if(n<=0) root=NULL; else PreInOrd(preord,inord,1,n,1,n,&root) return root;}

//算法3.7:统计二叉树的叶子结点算法int BitreeLeaf(BTree bt) if(bt==NULL) return 0; if(bt->left==NULL & bt->right==NULL) return 1; return (BitreeLeaf(bt->left)+BirLeaf(bt->right));}

//算法3.8:求二叉树深度算法int BitreeDepth (BiTree bt){ if(bt==NULL) return 0; if(bt->lchild==NULL & bt->rchild==NULL) return1; depthL=BitreeDepth(bt->lchild); depthR=BitreeDepth(bt->rchild); return 1+max(depthL,depthR);}

//算法3.12:二叉树的查找算法BiTree SearchBST(BiTree bt,KeyType key){ if(bt==NULL || key==bt->data.key) return bt; if(key<bt->data.key) return SearchBST(bt->lchild,key); else return SearchBST(bt->rchild,key);}

//算法3.13:在二叉树中插入结点int InseartBST(BiTreeNode **bt,Datatype e){ BiTreeNode *qq=new BiTreeNode(),*pp=new BiTreeNode(); BiTreeNode **qq=&qq,*s,**p=&pp; *q=OxO; *p=OxO; if(SearchBST(*bt,e.key,p,q)==0)//待查结点是否在二叉排序树中 { s=new BiTreeNode(); s->data=e;s->lchild=s->rchild=OxO;//待查结点 if(!(*q)) *bt=s;//二叉树的根 else if(e.key<(*q)->data.key) (*q)->lchild=s;//作为左儿子插入 else(*q)->rchild=s;//作为右儿子插入 return 1; } else return 0;}

//算法3.14:在二叉排序树中删除结点int DeleteNode(BitreeNode **t,int key){ BiTreeNode *pp=new BiTreeNode(),*ff=new BiTreeNode; BiTreeNode **p=&pp,*s,*q,**f=&ff; *p=OxO;*f=OxO; int flag=0; if(SearchBST(*t,key,f,p)!=0){ flag=1;//查找成功,置删除标记,待删除结点为p if(!((*p)->rchild)){//结点无右儿子,结点只有一个分支或为叶子结点 if((*f)->lchild==*p) (*f)->lchild=(*P)->lchild; else (*f)->rchild=(*p)->lchild; } else{//结点有右儿子 if(!((*p)->lchild)){//结点无左儿子,一个分支 if((*f)->lchild==*p) (*f)->lchild=(*P)->rchild; else (*f)->rchild=(*p)->rchild; } else {//结点有左二子,两个分支 q=*p; s=(*p)->lchild; while(s->rchild){q=s;s=s->rchild;}//在结点p的左分支上沿右指针域往下找,直到右指针域为空时为止 (*p)->data=s->data; if(q!=*p){(q)->rchild=s->lchild;} else(q)->lcild=s->lchild; } } } return flag;}

⑨ 试给出二叉树的自上而下,自右而左的层次遍历算法

  1. 根节点入队

  2. 判定队列是否为空,将队顶元素e出队

  3. e的右节点不为空则入队

  4. e的左节点不为空则入队

  5. 重复2,3,4直到队列为空

热点内容
微信开发用什么服务器 发布:2024-09-25 07:18:32 浏览:364
手机服务器网络是什么意思 发布:2024-09-25 07:06:04 浏览:749
天音脚本 发布:2024-09-25 06:55:30 浏览:820
怎么连接vps服务器 发布:2024-09-25 06:55:19 浏览:217
win7装linux系统 发布:2024-09-25 06:49:29 浏览:637
genericinjava 发布:2024-09-25 06:49:21 浏览:235
sql的执行步骤 发布:2024-09-25 06:43:47 浏览:131
手机照片存储路径 发布:2024-09-25 06:25:04 浏览:796
ftp数据怎么导出 发布:2024-09-25 06:20:37 浏览:777
微信安卓手机从哪里下载 发布:2024-09-25 06:02:09 浏览:21