二叉树的算法
来源:互联网 发布:cat翻译软件 编辑:程序博客网 时间:2024/06/07 15:49
#include<stdio.h>
typedef struct Node{
char data;
struct Node *LChild;
struct Node *RChild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree *bitree){
char c = getchar();
if(c == '.') (*bitree) = NULL;
else
{
(*bitree) = (BiTree)malloc(sizeof(BiTNode));
(*bitree) ->data = c;
CreateBiTree(&((*bitree)->LChild));
CreateBiTree(&((*bitree)->RChild));
}
}
//先序遍历二叉树
void PreOrder(BiTree root)
{
if(root != NULL){
//访问根节点
printf("%c",root->data);
//遍历左子树
PreOrder(root->LChild);
//遍历右子树
PreOrder(root->RChild);
}
}
//中序遍历二叉树
InOrder(BiTree root)
{
if (root!=NULL){
//遍历左子树
InOrder(root ->LChild);
//访问根节点
printf("%c",root ->data);
//遍历右子树
InOrder(root ->RChild);
}
}
//后序遍历二叉树
void PostOrder(BiTree root)
{
if(root!=NULL){
//遍历左子树
PostOrder(root ->LChild);
//遍历右子树
PostOrder(root ->RChild);
//访问根结点
printf("%c",root ->data);
}
}
//先序遍历输出二叉树结点, root为指向二叉树根结点的指针
void PreOrder1(BiTree root)
{
if (root!=NULL)
{
//访问根结点
printf("%c",root ->data);
//先序遍历左子树
PreOrder(root ->LChild);
//先序遍历右子树
PreOrder(root ->RChild);
}
}
//先序遍历输出二叉树中的叶子结点 , root为指向二叉树根结点的指针
void PreOrder2(BiTree root)
{
if (root!=NULL)
{
if (root ->LChild==NULL && root ->RChild==NULL)
//输出叶子结点
printf("%c",root ->data);
//先序遍历左子树
PreOrder(root ->LChild);
//先序遍历右子树
PreOrder(root ->RChild);
}
}
int leaf(BiTree root)
{
int LeafCount;
if(root==NULL)
LeafCount =0;
else if ((root->LChild==NULL)&&(root->RChild==NULL))
LeafCount =1;
else
LeafCount =leaf(root->LChild)+leaf(root->RChild);
return LeafCount;
}
//后序遍历求二叉树bt高度的递归算法
int PostTreeDepth(BiTree bt)
{
int hl, hr, max;
if(bt!=NULL)
{
//求左子树的深度
hl=PostTreeDepth(bt->LChild);
//求右子树的深度
hr=PostTreeDepth(bt->RChild);
//比较
max=hl>hr?hl:hr;
return(max+1);
}
else return(0);
}
int Hmax=0;
void PreTreeDepth(BiTree bt, int h)
{
if(bt==NULL) return ;
if(bt->LChild==NULL&&bt->RChild==NULL)
{
Hmax = Hmax>h ? Hmax:h;
}
//遍历左子树
PreTreeDepth(bt->LChild, h+1);
//遍历右子树
PreTreeDepth(bt->RChild, h+1);
}
int main()
{
BiTree tree;
CreateBiTree(&tree);
printf("PreOrder:\n");
PreOrder(tree);
printf("\nInOrder:\n");
InOrder(tree);
printf("\nPostOrder:\n");
PostOrder(tree);
printf("\nPreOrder1:\n");
PreOrder1(tree);
printf("\nPreOrder2:\n");
PreOrder2(tree);
printf("叶子数:%d\n",leaf(tree));
printf("后序遍历求二叉树的高度:%d\n",PostTreeDepth(tree));
Hmax=0;
PreTreeDepth(tree,1);
printf("\nPreTreeDepth: % d\n",Hmax);
return 0;
}
typedef struct Node{
char data;
struct Node *LChild;
struct Node *RChild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree *bitree){
char c = getchar();
if(c == '.') (*bitree) = NULL;
else
{
(*bitree) = (BiTree)malloc(sizeof(BiTNode));
(*bitree) ->data = c;
CreateBiTree(&((*bitree)->LChild));
CreateBiTree(&((*bitree)->RChild));
}
}
//先序遍历二叉树
void PreOrder(BiTree root)
{
if(root != NULL){
//访问根节点
printf("%c",root->data);
//遍历左子树
PreOrder(root->LChild);
//遍历右子树
PreOrder(root->RChild);
}
}
//中序遍历二叉树
InOrder(BiTree root)
{
if (root!=NULL){
//遍历左子树
InOrder(root ->LChild);
//访问根节点
printf("%c",root ->data);
//遍历右子树
InOrder(root ->RChild);
}
}
//后序遍历二叉树
void PostOrder(BiTree root)
{
if(root!=NULL){
//遍历左子树
PostOrder(root ->LChild);
//遍历右子树
PostOrder(root ->RChild);
//访问根结点
printf("%c",root ->data);
}
}
//先序遍历输出二叉树结点, root为指向二叉树根结点的指针
void PreOrder1(BiTree root)
{
if (root!=NULL)
{
//访问根结点
printf("%c",root ->data);
//先序遍历左子树
PreOrder(root ->LChild);
//先序遍历右子树
PreOrder(root ->RChild);
}
}
//先序遍历输出二叉树中的叶子结点 , root为指向二叉树根结点的指针
void PreOrder2(BiTree root)
{
if (root!=NULL)
{
if (root ->LChild==NULL && root ->RChild==NULL)
//输出叶子结点
printf("%c",root ->data);
//先序遍历左子树
PreOrder(root ->LChild);
//先序遍历右子树
PreOrder(root ->RChild);
}
}
int leaf(BiTree root)
{
int LeafCount;
if(root==NULL)
LeafCount =0;
else if ((root->LChild==NULL)&&(root->RChild==NULL))
LeafCount =1;
else
LeafCount =leaf(root->LChild)+leaf(root->RChild);
return LeafCount;
}
//后序遍历求二叉树bt高度的递归算法
int PostTreeDepth(BiTree bt)
{
int hl, hr, max;
if(bt!=NULL)
{
//求左子树的深度
hl=PostTreeDepth(bt->LChild);
//求右子树的深度
hr=PostTreeDepth(bt->RChild);
//比较
max=hl>hr?hl:hr;
return(max+1);
}
else return(0);
}
int Hmax=0;
void PreTreeDepth(BiTree bt, int h)
{
if(bt==NULL) return ;
if(bt->LChild==NULL&&bt->RChild==NULL)
{
Hmax = Hmax>h ? Hmax:h;
}
//遍历左子树
PreTreeDepth(bt->LChild, h+1);
//遍历右子树
PreTreeDepth(bt->RChild, h+1);
}
int main()
{
BiTree tree;
CreateBiTree(&tree);
printf("PreOrder:\n");
PreOrder(tree);
printf("\nInOrder:\n");
InOrder(tree);
printf("\nPostOrder:\n");
PostOrder(tree);
printf("\nPreOrder1:\n");
PreOrder1(tree);
printf("\nPreOrder2:\n");
PreOrder2(tree);
printf("叶子数:%d\n",leaf(tree));
printf("后序遍历求二叉树的高度:%d\n",PostTreeDepth(tree));
Hmax=0;
PreTreeDepth(tree,1);
printf("\nPreTreeDepth: % d\n",Hmax);
return 0;
}
阅读全文
1 0
- 二叉树的算法
- 二叉树的算法
- 二叉树的一些算法
- 求二叉树的算法
- 有序二叉树的算法
- 二叉树的递归算法
- 二叉树的遍历算法
- 二叉树深度的算法
- 二叉树的遍历算法
- 二叉树深度的算法
- 二叉树的遍历算法
- 显示二叉树的算法
- 二叉树的相关算法
- 二叉树的遍历算法
- 二叉树的三个算法
- 二叉树的基本算法
- 二叉树的遍历算法
- 二叉树的递归算法
- excel操作的几种方法
- 人工智能从入门到精通(9)
- SQL----关系型数据库之表与索引
- spring boot 获取项目全部URL
- 【Scikit-Learn 中文文档】新异类和异常值检测
- 二叉树的算法
- Javascript内存泄漏
- Shell脚本
- Linux上的free命令详解
- CSS 伪元素
- Spring 的核心 IOC 和AOP详解
- 属性动画的移动
- 【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题)
- 感知机学习模型