C语言 二叉树的链式存储实例

所属分类: 软件编程 / C 语言 阅读数: 67
收藏 0 赞 0 分享

二叉树的链式存储

实现二叉树的基本操作:建立、遍历、计算深度、结点数、叶子数等。

输入C,先序创建二叉树,#表示空节点;

输入H:计算二叉树的高度;

输入L:计算二叉树的叶子个数;

输入N:计算二叉树节点总个数;

输入1:先序遍历二叉树;

输入2:中序遍历二叉树;

输入3:后续遍历二叉树;

输入F:查找值=x的节点的个数;

输入P:以缩格文本形式输出所有节点。

很简单就不需要多解释了,代码贴上

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
/*二叉树的链式存储表示*/
typedef char DataType; /*应由用户定义DataType的实际类型*/
typedef struct node
{
 DataType data;
 node *lchild, *rchild; /*左右孩子指针*/
} BinTNode;   /*结点类型*/
typedef BinTNode *BinTree;
int sum=0;
void DisplayBinTree(BinTree T); /*用格文本形式表示二叉树*/
void CreateBinTree(BinTree *T); /*构造二叉链表*/
void Preorder(BinTree T); /*前序遍历二叉树*/
void Inorder(BinTree T); /*中序遍历二叉树*/
void Postorder(BinTree T); /*后序遍历二叉树*/
int nodes(BinTree T);  /*计算总结点数*/
int leafs(BinTree T);  /*计算总叶子数*/
int hight(BinTree T);  /*计算二叉树的高度*/
int find(BinTree T,char x); //查找值=x的节点的个数;
int main()
{
 BinTree T;
 char flg;
 while(cin>>flg)
 switch(flg)
 {
 case'C':
  getchar();
  CreateBinTree(&T);
  cout<<"Created success!"<<endl;
  break;
 case'H':
  cout<<"Height="<<hight(T)<<"."<<endl;
  break;
 case'L':
  cout<<"Leaf="<<leafs(T)<<"."<<endl;
  break;
 case'N':
  cout<<"Nodes="<<nodes(T)<<"."<<endl;
  break;
 case'1':
  printf("Preorder is:");
  Preorder(T);
  cout<<"."<<endl;
  break;
 case'2':
  printf("Inorder is:");
  Inorder(T);
  cout<<"."<<endl;
  break;
 case'3':
  printf("Postorder is:");
  Postorder(T);
  cout<<"."<<endl;
  break;
 case'F':
  char x;
  int ko;
  getchar();
  cin>>x;
  ko=find(T,x);
  cout<<"The count of "<<x<<" is "<<ko<<"."<<endl;
  break;
 case'P':
  cout<<"The tree is:"<<endl;
  DisplayBinTree(T);
  break;
 default:
  cout<<"输入有误,请重新输入"<<endl;
 }
}

/*构造二叉链表*/
void CreateBinTree(BinTree *T)
{
 char ch;
 if ((ch=getchar())=='#')
 *T=NULL;
 else
 {
 /*读入非空格*/
 *T=(BinTNode *)malloc(sizeof(BinTNode));/*生成结点*/
 (*T)->data=ch;
 CreateBinTree(&(*T)->lchild );  /*构造左子树*/
 CreateBinTree(&(*T)->rchild );  /*构造右子树*/
 }
}
/*用缩格文本形式表示二叉树*/
void DisplayBinTree(BinTree T)
{
 BinTree stack[100],p;
 int level[100],top,n,i;
 if (T)
 {
 top=1;
 stack[top]=T;
 level[top]=0;
 while(top>0)
 {
  p=stack[top];
  n=level[top];
  for (i=1; i<=n; i++)
  cout<<" ";
  printf("%c\n",p->data);
  top--;
  if (p->rchild!=NULL)
  {
  top++;
  stack[top]=p->rchild;
  level[top]=n+2;
  }
  if (p->lchild!=NULL)
  {
  top++;
  stack[top]=p->lchild;
  level[top]=n+2;
  }
 }
 }
}
/*计算总结点数*/
int nodes(BinTree T)
{
 if(T)
 {
 if( (T->lchild==NULL)&&(T->rchild==NULL))
  return 1;
 else
  return nodes(T->lchild)+nodes(T->rchild)+1;
 }
 return 0;
}
/*计算总叶子数*/
int leafs(BinTree T)
{
 if(T)
 {
 if ((T->lchild==NULL)&&(T->rchild==NULL))
  return 1;
 else
  return leafs(T->lchild)+leafs(T->rchild);
 }
 return 0;
}
/*计算树的高度*/
int hight(BinTree T)
{
 if(T)
 {
 if ((T->lchild==NULL)&&(T->rchild==NULL))
  return 1;

 else if((T->lchild==NULL)&&(T->rchild))
  return 1+hight(T->rchild);

 else if((T->lchild)&&(T->rchild==NULL))
  return 1+hight(T->lchild);

 else
  return hight(T->lchild)+hight(T->rchild);
 }
 return 0;
}
/*前序遍历二叉树*/
void Preorder(BinTree T)
{
 if(T)
 {
 printf("%c ",T->data); /*访问结点*/
 Preorder(T->lchild);
 Preorder(T->rchild);
 }
}
/*中序遍历二叉树*/
void Inorder(BinTree T)
{
 if(T)
 {
 Inorder(T->lchild);
 printf("%C ",T->data);
 Inorder(T->rchild);
 }
}
/*后序遍历二叉树*/
void Postorder(BinTree T)
{
 if(T)
 {
 Postorder(T->lchild);
 Postorder(T->rchild);
 printf("%C ",T->data);
 }
}
int find(BinTree T,char x)
{
 if(T)
 {
 if((T->data)==x)
  sum++;
 find(T->lchild,x);
 find(T->rchild,x);

 }
 return sum;
}

以上就是二叉树链式存储的一个小实例,需学习要的同学请参考,谢谢支持

更多精彩内容其他人还在看

C++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多