| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 724 人关注过本帖
标题:请教,关于二叉树
只看楼主 加入收藏
zzyxtfncel
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-5-22
收藏
 问题点数:0 回复次数:1 
请教,关于二叉树

C语言实现
⑴ 二叉树的建立
提示:已知一棵二叉树,共有n个结点,建立该二叉树,建立方法如下:
a.按照完全二叉树的编号方法,对该二叉树进行编号。
b.每次输入一个结点的值x和该结点的编号k,动态申请一块空间来存放该结点,空间的地址为p。
c.把p值赋给adr[k]中。
d.如果k=1,转到“f”;否则,把p的值填入其父结点的指针域中。p的父结点地址为adr[k/2],若k为偶数,则做adr[k/2]->lc=p;若k为奇数,则做adr[k/2]->rc=p。
f.重复“b”到“d”,直到全部结点数据输入完为止。
⑵ 实现前序遍历二叉树的非递归算法
提示:使用栈来实现前序遍历二叉树的基本思想是:
① 从二叉树的根结点开始,沿左支一直走到没有左孩子的结点为止。
② 在走的过程中访问所遇结点,并依次将所遇结点的非空右孩子进栈。
③ 当找到没有左孩子的结点时,如果该结点有右孩子,则从栈顶退出该结点的右孩子并访问之,然后前序遍历该结点的右子树。
④ 如果该结点无右孩子,则从栈顶退出该结点的双亲或祖先的右孩子并访问之,然后前序遍历该结点的双亲或祖先的右子树。
⑤ 按上述过程遍历所有子树,如此重复直到栈空。

搜索更多相关主题的帖子: 二叉树 结点 空间 adr 
2007-05-22 11:48
a402730324
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:1233
专家分:0
注 册:2005-12-1
收藏
得分:0 

#include<iostream>
using namespace std;
typedef int elemtype;
typedef struct binode
{
elemtype data;
struct binode *lchild,*rchlid;
}binode,*pbinode;

class bitree
{
//所有的函数功能默认为先序遍历和建立
pbinode elem;
int count;//结点个数
void create(pbinode &elem);//递归调用建立二叉树
void bianli(pbinode elem);//递归遍历
void createtree();//层序建表
int depth(pbinode);//递归求二叉树的深度
public:
bitree();
bitree(int);//非递归调用建立二叉树
void traverse();//二叉树遍历函数
void traverse(int);//非递归遍历二叉树
void traversetree();//层序遍历
void traversetree(int);//分层显示的层序遍历
int bitree_depth();//二叉树的深度
int bitree_width();//二叉树的宽度
void depths();
void yezi_shuliang();//叶子结点的个数
void jiediangeshu();//结点个数
//中序遍历


};
bitree::bitree()
{
create(elem);
//createtree();
}

void bitree::create(pbinode &elem)
{
//先序建立
int a;
cin>>a;
if(a==0)elem=NULL;
else
{elem=new binode;
elem->data=a;
create(elem->lchild);
create(elem->rchlid);
}
}

bitree::bitree(int a)
{
pbinode s[30];
int top=-1;
pbinode p,r;
elemtype e;
cin>>e;
if(e==0)elem=NULL;
else {elem=new binode;
elem->data=e;
elem->lchild=NULL;
elem->rchlid=NULL;
p=elem;
top++;
s[top]=p;
cin>>e;
do
{
while(e)
{
pbinode q=new binode;
q->data=e;
q->lchild=NULL;
q->rchlid=NULL;
top++;
s[top]=q;
if(p){p->lchild=q;p=q;}
else {r->rchlid=q;p=q;}
cin>>e;
}
r=p=s[top];
top--;
p=p->rchlid;
cin>>e;}while(top!=-1||e);}
}

void bitree::bianli(pbinode elem)
{
if(elem)
{
cout<<elem->data<<" ";
bianli(elem->lchild);
bianli(elem->rchlid);
}
}

void bitree::traverse()
{
bianli(elem);
}

void bitree::traverse(int a)
{
pbinode s[20];
pbinode p=elem;
int top=-1;
do
{
while(p)
{cout<<p->data<<" ";
top++;
s[top]=p;
p=p->lchild;
}
p=s[top];
top--;
p=p->rchlid;

}while(top!=-1||p);
}

void bitree::createtree()
{
pbinode s[20];
elemtype e;
int i;
cout<<"输入值和序号"<<endl;
cin>>e>>i;
if(e==0||i==0)elem=NULL;
else while(e!=0&&i!=0)
{
pbinode p=new binode;
p->data=e;
p->lchild=NULL;
p->rchlid=NULL;
s[i]=p;
if(i==1)elem=p;
else
{int j=i/2;
if(i%2==0)s[j]->lchild=p;
else s[j]->rchlid=p;}
cin>>e>>i;
}

}

void bitree::traversetree()
{
pbinode b[30];
pbinode p=elem;
int front,rear;
front=rear=0;
if(p)
{rear++;b[rear]=p;}
while(front!=rear)
{
//出队
front++;
p=b[front];
cout<<p->data;
//入队
if(p->lchild){rear++;b[rear]=p->lchild;}
if(p->rchlid){rear++;b[rear]=p->rchlid;}

}

}

void bitree::traversetree(int a)
{

pbinode b[30];
pbinode p=elem;
int front,rear,m;
front=rear=0;
if(p)
{rear++;b[rear]=p;m=1;}
while(front!=rear)
{
//出队
int c=0;
for(int i=0;i<m;i++)
{front++;
p=b[front];
cout<<p->data;
//入队
if(p->lchild){rear++;b[rear]=p->lchild;c++;}
if(p->rchlid){rear++;b[rear]=p->rchlid;c++;}
}
m=c;
cout<<endl;
}

}

int bitree::bitree_depth()
{
pbinode b[30];
pbinode p=elem;
int front,rear,m,j=0;
front=rear=0;
if(p)
{rear++;b[rear]=p;m=1;}
while(front!=rear)
{

int c=0;
for(int i=0;i<m;i++)
{
//出队
front++;
p=b[front];
//入队
if(p->lchild){rear++;b[rear]=p->lchild;c++;}
if(p->rchlid){rear++;b[rear]=p->rchlid;c++;}
}
m=c;
j++;
}
return j;
}

int bitree::bitree_width()
{
pbinode b[30];
pbinode p=elem;
int front,rear,m,d;
front=rear=0;
if(p)
{rear++;b[rear]=p;d=m=1;}
while(front!=rear)
{

int c=0;
for(int i=0;i<m;i++)
{
//出队
front++;
p=b[front];
//入队
if(p->lchild){rear++;b[rear]=p->lchild;c++;}
if(p->rchlid){rear++;b[rear]=p->rchlid;c++;}
}
m=c;
if(m>d)d=m;
}
return d;
}

int bitree::depth(pbinode t)
{
int hl,hr;
if(!t)return 0;
else
{
hl=depth(t->lchild);
hr=depth(t->rchlid);
if(hl>hr)return hl+1;
else return hr+1;
}
}

void bitree::depths()
{
int i=depth(elem);
cout<<i;
}

void bitree::yezi_shuliang()
{
pbinode s[20];
int rear=0;
int front=0;
int count=0;
pbinode p=elem;
if(p){s[rear]=p;rear++;}
while(front!=rear)
{
//出队
p=s[front];
front++;
if(!p->lchild&&!p->rchlid)count++;
//入队
if(p->lchild){s[rear]=p->lchild;rear++;}
if(p->rchlid){s[rear]=p->rchlid;rear++;}
}
cout<<"叶子接点个数为:"<<count<<endl;
}

void bitree::jiediangeshu()
{
pbinode s[20];
int rear=0;
int front=0;
int count=0;
pbinode p=elem;
if(p){s[rear]=p;rear++;}
while(front!=rear)
{
//出队
p=s[front];
front++;
count++;
//入队
if(p->lchild){s[rear]=p->lchild;rear++;}
if(p->rchlid){s[rear]=p->rchlid;rear++;}
}
cout<<"结点个数为:"<<count<<endl;
}




自己写的 ,还没有整理好,你先看看,有不清楚的再说。


敢犯强汉者,虽远必诛!——陈汤 不知吾辈何时方能吐出此豪言壮语?
2007-05-22 14:19
快速回复:请教,关于二叉树
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.113581 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved