1、二叉树的基本运算
#define MaxSize 100
typedef char ElemType;
typedef struct node{
ElemType data;
struct node *lchild;
struct node *rchild;
}BTNode;
void CreateBTNode(BTNode *&b,char *str){
BTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0'){
switch (ch) {
case '(':top++,St[top]=p;k=1;break;
case ')':top--;break;
case ',': k=2;break;
default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if(b==NULL){
b=p;
}else{
switch (k) {
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
BTNode *FindNode(BTNode *b,ElemType x){
BTNode *p;
if(b==NULL){
return NULL;
}
else if(b->data==x){
return b;
}else{
p=FindNode(b->lchild, x);
if(p!=NULL){
return p;
}else{
return FindNode(b->rchild, x);
}
}
}
BTNode *LchildNode(BTNode *p){
return p->lchild;
}
BTNode *RchildNode(BTNode *p){
return p->rchild;
}
int BTNodeDepth(BTNode *b){
int lchilddep,rchilddep;
if(b==NULL){
return 0;
}else{
lchilddep=BTNodeDepth(b->lchild);
rchilddep=BTNodeDepth(b->rchild);
return lchilddep>rchilddep?lchilddep+1:rchilddep+1;
}
}
void DispBTNode(BTNode *b){
if(b!=NULL){
printf("%c ",b->data);
if(b->lchild!=NULL||b->rchild!=NULL){
printf("(");
DispBTNode(b->lchild);
if(b->rchild!=NULL){
printf(",");
DispBTNode(b->rchild);
}
printf(")");
}
}
}
int BTWidth(BTNode *b){
struct{
int lno;
BTNode *p;
}Qu[MaxSize];
int front,rear;
int lnum,max,i,n;
front=rear=0;
if(b!=NULL){
rear++;
Qu[rear].p=b;
Qu[rear].lno=1;
while(rear!=front){
front++;
b=Qu[front].p;
lnum=Qu[front].lno;
if(b->lchild!=NULL){
rear++;
Qu[rear].p=b->lchild;
Qu[rear].lno=lnum+1;
}
if(b->rchild!=NULL){
rear++;
Qu[rear].p=b->rchild;
Qu[rear].lno=lnum+1;
}
}
max=0;lnum=1;i=1;
while(i<=rear){
n=0;
while(i<=rear&&Qu[i].lno==lnum){
n++;
i++;
}
lnum=Qu[i].lno;
if(n>max){
max=n;
}
}
return max;
}else{
return 0;
}
}
int Nodes(BTNode *b){
if(b==NULL){
return 0;
}else if(b->lchild==NULL&&b->rchild==NULL){
return 1;
}else{
return Nodes(b->lchild)+Nodes(b->rchild)+1;
}
}
int LeafNodes(BTNode *b){
if(b==NULL){
return 0;
}else if(b->lchild==NULL&&b->rchild==NULL){
return 1;
}else{
return LeafNodes(b->lchild)+LeafNodes(b->rchild);
}
}
2、二叉树的遍历
2.1递归遍历
void PreOrder(BTNode *b)
{
if(b!=NULL){
printf("%c",b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
void InOrder(BTNode *b){
if(b!=NULL){
InOrder(b->lchild);
printf("%c",b->data);
InOrder(b->rchild);
}
}
void PostOrder(BTNode *b){
if(b!=NULL){
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c",b->data);
}
}
2.2非递归遍历
void ProOrder1(BTNode *b)
{
BTNode *p;
struct {
BTNode *pt;
int tag;
}St[MaxSize];
int top=-1;
top++;
St[top].pt=b;
St[top].tag=1;
while(top>-1){
if(St[top].tag==1){
p=St[top].pt;
top--;
if(p!=NULL){
top++;
St[top].pt=p->rchild;
St[top].tag=1;
top++;
St[top].pt=p->lchild;
St[top].tag=1;
top++;
St[top].pt=p;
St[top].tag=0;
}
}
if(St[top].tag==0){
printf("%c",St[top].pt->data);
top--;
}
}
}
void InOrder1(BTNode *b){
BTNode *p;
struct {
BTNode *pt;
int tag;
}St[MaxSize];
int top=-1;
top++;
St[top].pt=b;
St[top].tag=1;
while(top>-1){
if(St[top].tag==1){
p=St[top].pt;
top--;
if(p!=NULL){
top++;
St[top].pt=p->rchild;
St[top].tag=1;
top++;
St[top].pt=p;
St[top].tag=0;
top++;
St[top].pt=p->lchild;
St[top].tag=1;
}
}
if(St[top].tag==0){
printf("%c",St[top].pt->data);
top--;
}
}
}
void PostOrder1(BTNode *b){
BTNode *p;
struct {
BTNode *pt;
int tag;
}St[MaxSize];
int top=-1;
top++;
St[top].pt=b;
St[top].tag=1;
while(top>-1){
if(St[top].tag==1){
p=St[top].pt;
top--;
if(p!=NULL){
top++;
St[top].pt=p;
St[top].tag=0;
top++;
St[top].pt=p->rchild;
St[top].tag=1;
top++;
St[top].pt=p->lchild;
St[top].tag=1;
}
}
if(St[top].tag==0){
printf("%c",St[top].pt->data);
top--;
}
}
}
3、从叶子节点到根结点的路径
void AllPath(BTNode *b)
{
struct snode {
BTNode *node;
int parent;
}Qu[MaxSize];
int front,rear,p;
front=rear=-1;
rear++;
Qu[rear].node=b;
Qu[rear].parent=-1;
while(front<rear){
front++;
b=Qu[front].node;
if(b->lchild==NULL&&b->rchild==NULL){
printf("%c到根结点的路径: ",b->data);
p=front;
while(Qu[p].parent!=-1){
printf(" %c",Qu[p].node->data);
p=Qu[p].parent;
}
printf(" %c\n",Qu[p].node->data);
}
if(b->lchild!=NULL){
rear++;
Qu[rear].node=b->lchild;
Qu[rear].parent=front;
}
if(b->rchild!=NULL){
rear++;
Qu[rear].node=b->rchild;
Qu[rear].parent=front;
}
}
}
void AllPath1(BTNode *b,ElemType path[],int pathlen){
int i;
if(b!=NULL){
if(b->lchild==NULL&&b->rchild==NULL){
printf(" %c到根接的路径: %c",b->data,b->data);
for(i=pathlen-1;i>=0;i--){
printf(" %c",path[i]);
}
printf("\n");
}else{
path[pathlen]=b->data;
pathlen++;
AllPath1(b->lchild, path, pathlen);
AllPath1(b->rchild, path, pathlen);
pathlen--;
}
}
}
void LongPath(BTNode *b,ElemType path[],int pathlen,ElemType longpath[],int &longpathlen){
int i;
if(b==NULL){
if(pathlen>longpathlen){
for (i=pathlen-1; i>=0; i--) {
longpath[i]=path[i];
}
longpathlen=pathlen;
}
}else{
path[pathlen]=b->data;
pathlen++;
LongPath(b->lchild, path, pathlen, longpath, longpathlen);
LongPath(b->rchild, path, pathlen, longpath, longpathlen);
pathlen--;
}
}
void DispLeaf(BTNode *b){
if(b!=NULL){
if(b->lchild==NULL&&b->rchild==NULL){
printf("%c ",b->data);
}else{
DispLeaf(b->lchild);
DispLeaf(b->rchild);
}
}
}
分享到:
相关推荐
C语言数据结构实现二叉树的建立与遍历.cpp
数据结构——二叉树的实现,包含二叉链表和左子右兄弟两种实现方法
一、问题描述 运用二叉链表实现二叉树的基本操作,包括:创建二叉树的存储结构、复制...1、构造二叉树的二叉链表数据结构。 2、实现二叉树的创建、复制、计算二叉树的深度、先根序序列、中根序序列、后根序序列等操作。
数据结构 线索二叉树 严蔚敏 数据结构 线索二叉树 严蔚敏 数据结构 线索二叉树 严蔚敏 数据结构 线索二叉树 严蔚敏 数据结构 线索二叉树 严蔚敏 数据结构 线索二叉树 严蔚敏
数据结构 二叉树 二叉树的各种函数实现 界面好看。。。数据结构 二叉树 二叉树的各种函数实现 界面好看。。。
用二叉树实现简单的姓氏图谱管理系统本课程设计主要解决在一个家族中,对姓氏图谱进行管理的问题,通过建立一个相容,一致,易查和全面的姓氏图谱管理系统,实现对家族姓氏的插入,删除,显示和查询。在本课程设计中...
数据结构课程设计数据结构课程设计数据结构课程设计数据结构课程设计数据结构课程设计数据结构课程设计
数据结构 课设 二叉树 C++ // 获取二叉树的高度 int TreeHeight(Node *root) { if (root == NULL) return 0; else return 1 + max(TreeHeight(root->lchild), TreeHeight(root->rchild)); } //建立二叉树……...
该文件包括二叉树的头文件(BitTree开头)和堆栈的头文件(Seq开头),另外还实现了编写按层次顺序(同一层自左至右)遍历二叉树的算法、后序递归遍历计算二叉树的深度的算法、判断给定二叉树是否为完全二叉树(通过...
数据结构二叉树家谱:文件操作功能,家谱操作功能
数据结构实验,二叉树类型的实现,完美代码、报告。
数据结构二叉树接口实现
二叉树的实现,是学习灯俊辉版数据结构与算法课程时的练习代码
C#语言实现数据结构之二叉树 在数据结构中,二叉树是一种非常重要的非线性聚合树种的一种。在下面的内容中,作者将通过C#语言去描述这样的数据结构。 目录: 1. 二叉树的基础知识 2. C#实现二叉树原理 3. 实现...
2、实现该二叉树的先序遍历、中序遍历和后序遍历递归算法,输出各遍历序列; 3、统计出该二叉树中叶子结点个数; 4、实现该二叉树的中序遍历非递归算法; 5、实现交换该二叉树所有结点左右子女的操作。*/
二叉树操作,二叉树操作 前序 先序 后序 查找等等操作的代码
数据结构 二叉树三种遍历的非递归算法(背诵版). 数据结构 二叉树三种遍历的非递归算法(背诵版). 数据结构 二叉树三种遍历的非递归算法(背诵版).
在该程序中,使用了C++来实现二叉树的各种算法。那么应该对学习数据结构的朋友有用
数据结构二叉树实验报告
山东大学数据结构课设二叉树实现及分析