C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)
关于二叉树的定义,网上有比较好的介绍,在这里就简单介绍二叉树的一些性质
二叉树的基本性质
2)深度为 h 的二叉树中至多含有 2^h – 1 个结点;
3)若在任意一棵二叉树中,有 n0 个叶子结点,有 n2 个度为 2 的结点,则:n0 = n2 + 1。
特殊形式的二叉树
特点:深度为h且含有2h-1个结点的二叉树,为满二叉树。图示满二叉树,结点编号为自上而下,自左而右。
2)完全二叉树(左图)
特点:指深度为k的,有n个结点的,且每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应,完全一致,则为完全二叉树。(右图)
特点:又称AVL树,它或为一棵空树,或具如下性质:其左子树和右子树都是平衡二叉树,且左、右子树的深度之差的绝对值不超过1。左、右子树的深度之差为平衡因子,平衡二叉树的平衡因子只能为0,-1,1。
关于二叉树的存储方式(顺序和链式存储)
用一组连续的存储单元存放二叉树的数据元素。结点在数组中的相对位置蕴含着结点之间的关系。
关于二叉树的三种遍历方式
(2)中序遍历(L D R): 按中序遍历左子树,访问根结点,按中序遍历右子树。
(3)后序遍历(L R D): 按后序遍历左子树,按后序遍历右子树,访问根结点。
struct Tree{int data;//这里可以改成你想要的数据类型tree *left;tree *right;
};
初始化二叉树,添加数据
tree *initTree(tree* H){H = NULL;int data = 0;printf(" 输入data \n ");scanf("%d",&data);if(data!=0){H = (tree *)malloc(sizeof(tree));H->data = data;printf(" t data is %d \n",H->data);printf(" 请输入左字树data \n");H->left = initTree(H->left);printf(" 请输入右字树data \n");H->right = initTree(H->right);}return H;
}
先序,中序,后序遍历的递归算法(ps:递归真是个好东西~~,写出来的代码就是简洁~~)
/*
先序遍历
*/
void DLR(tree* T){if(NULL!=T){printf(" data is %5d \n ",T->data);DLR(T->left);DLR(T->right);}
}
/*
中序遍历
*/
void LDR(tree* T){if(NULL!=T){LDR(T->left);printf(" data is %5d \n",T->data);LDR(T->right);}
}
/*
后序遍历
*/
void LRD(tree* T){if(NULL!=T){LRD(T->left);LRD(T->right);printf(" data is %5d \n",T->data);}
}
void LOrder(tree* T) /* 层次遍历二叉树T */
{ treeQ[MAXNODE]; /* 辅助队列,MAXNODE为最大的队列容量 */ int f,r; /* 队列的首、尾指针 */if (T == NULL) return; /* 空树,直接返回 */f = -1; /* 队首,队尾指针初始化 */ r = 0;Q[r] = T; /* 树根进队 */while( f != r ){ f++;printf(“%d”,Q[f]->data); /* 访问队首结点的数据域 */if (Q[f]->left!= NULL) /* 将队首结点的左孩子入队列 */{ r++;Q[r] = Q[f]->left; }if (Q[f]->right!= NULL) /* 将队首结点的右孩子入队列 */{ r++;Q[r] = Q[f]->right; }}
}
计算二叉树的深度;
/*计算树的深度*/
int deep(tree* H){int d1 = 0;int d2 = 0;if(NULL!=H){d1 = deep(H->left) +1;d2 = deep(H->right) +1;}return d1>=d2? d1:d2;
}
计算总的节点数和叶子数
//计算总的节点数
int node(tree* H){int n = 0;if(NULL!=H){n = node(H->left)+node(H->right) +1;}return n;
}
//计算叶子节点
int CountLeaf(tree* H){if(NULL==H) return 0;if((NULL==H->left)&&(NULL==H->right)){return 1;}return CountLeaf(H->left) + CountLeaf(H->right);
}
#include <stdio.h>
#include <malloc.h>
typedef struct Tree tree ;
/*
定义二叉树的结构体
*/
struct Tree{int data;tree *left;tree *right;
};
tree *p[100];
/*
初始化二叉树
*/
tree *initTree(tree* H){H = NULL;int data = 0;printf(" 输入data \n ");scanf("%d",&data);if(data!=0){H = (tree *)malloc(sizeof(tree));H->data = data;printf(" t data is %d \n",H->data);printf(" 请输入左字树data \n");H->left = initTree(H->left);printf(" 请输入右字树data \n");H->right = initTree(H->right);}return H;
}
/*
先序遍历
*/
void DLR(tree* H){if(NULL!=H){printf(" data is %5d \n ",H->data);DLR(H->left);DLR(H->right);}
}/*
中序遍历
*/
void LDR(tree* H){if(NULL!=H){LDR(H->left);printf(" data is %5d \n",H->data);LDR(H->right);}
}/*
后序遍历
*/
void LRD(tree* H){if(NULL!=H){LRD(H->left);LRD(H->right);printf(" data is %5d \n",H->data);}
}/*
计算树的深度
*/
int deep(tree* H){int d1 = 0;int d2 = 0;if(NULL!=H){d1 = deep(H->left) +1;d2 = deep(H->right) +1;}return d1>=d2? d1:d2;
}
//计算总的节点数
int node(tree* H){int n = 0;if(NULL!=H){n = node(H->left)+node(H->right) +1;}return n;
}
//计算叶子节点
int CountLeaf(tree* H){if(NULL==H) return 0;if((NULL==H->left)&&(NULL==H->right)){return 1;}return CountLeaf(H->left) + CountLeaf(H->right);
}
void main(){tree *H = (tree*)malloc(sizeof(tree)) ;H = initTree(H);printf("DLR : \n");DLR(H);printf("LDR : \n");LDR(H);printf("LRD : \n");LRD(H);printf("\n deep is %5d \n ",deep(H));printf(" CountLeaf is %5d \n",CountLeaf(H));printf(" node number is %5d \n",node(H));
}
大概就这么多了。想起了在补充吧~~
3)平衡二叉树
特点:又称AVL树,它或为一棵空树,或具如下性质:其左子树和右子树都是平衡二叉树,且左、右子树的深度之差的绝对值不超过1。左、右子树的深度之差为平衡因子,平衡二叉树的平衡因子只能为3)平衡二叉树
特点:又称AVL树,它或为一棵空树,或具如下性质:其左子树和右子树都是平衡二叉树,且左、右子树的深度之差的绝对值不超过1。左、右子树的深度之差为平衡因子,平衡二叉树的平衡因子只能为0,-1,1。
C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)相关推荐
- 【数据结构】理解二叉树的三种遍历--前序、中序、后序 +层序(简明易懂)
一.易懂的形象理解 其实从名字就可以很好的理解这三种遍历,我在第二点时候说,但是估计能翻到我的文的同学们之前肯定看过好多类似的了,那咱们换个思路~ 先用我想的一种简单易懂的形象思维理解一下前序.中序. ...
- 二叉树----数据结构:二叉树的三种遍历及习题
二叉树----数据结构:二叉树的三种遍历,利用递归算法. 关于二叉树的遍历,应用非常广泛,不单单是访问打印结点,还可以进行一系列的操作,如赋值.删除.查找.求二叉树的深度等等. 有递归和非递归两种算法 ...
- c语言二叉树的遍历菜单系统,C语言二叉树的三种遍历方式的实现及原理
C语言二叉树的三种遍历方式的实现及原理 发布时间:2020-10-03 19:43:57 来源:脚本之家 阅读:63 作者:看雪. 二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个 ...
- c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理
二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...
- 二叉树的三种遍历(递归与非递归) + 层次遍历
<转载于 >>> > 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此 ...
- 详解二叉树的三种遍历方式(递归、迭代、Morris算法)
详解二叉树的三种遍历方式(递归.迭代.Morris算法) 最重要的事情写在前面:遍历顺序不一定就是操作顺序!!! 递归解法 首先,一颗二叉树它的递归序列是一定的,导致其前中后序不同的原因只不过是访问节 ...
- 二叉树的三种遍历方式(递归、非递归和Morris遍历)
二叉树的三种遍历方式(递归.非递归和Morris遍历) 原文:http://www.linuxidc.com/Linux/2015-08/122480.htm 二叉树遍历是二叉树的最基本的操作,其实现 ...
- 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历
二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...
- python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)
树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ######################P6.4 数据结构### ...
最新文章
- 问号和星号 php,星号和问号两个通配符
- 三种睡眠时间函数的区别:linux 的sleep()、usleep()、nanosleep()函数
- 常见的HTML元素及常见检查点
- 开发笔记- iOS监听某些事件的方法简单梳理
- C语言嵌入式系统编程修炼之道——背景篇
- linux将日期和日历信息追加到文件中_Linux常用指令
- Getting Contexts 获得上下文
- GitHub Actions 部署 VuePress 文档
- Python小项目(一)-----------计算体脂率
- 使用Redis来做浏览量统计
- Hibernate-部分知识点概述(持续更新)
- [Pyhon疫情大数据分析] 四.微博话题抓取及新冠肺炎疫情文本挖掘和情感分析
- 如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。编程计算并输出所有的n的所有情况。
- 计算标准累积正态分布_正态分布在用户等级划分的应用
- 2022:OFA: Unifying Architectures, Tasks, and Modalities through A Simple S2s Learning Framework
- Pytorch中DistributedSampler()中的随机因素
- 关于Node里面的pause和pauseSchedulerAndActions
- 联想ThinkPad E40安装XP及Ghost备份还原全记录
- java银行接口开发_银行接口开发,该如何解决
- [附源码]计算机毕业设计springboot海滨学院学生大创项目申报与审批系统
热门文章
- wcf 返回图片_WCF实现上传图片功能
- 行业短信 运营思路_飞信、易信之后 三大运营商要借5G再战微信
- java能应聘哪些职位_应聘java专员职位的面试题
- linux下glew例子,一个简单的GLSL Shader例子
- 重启网卡服务_Linux下查看不到物理网卡配置
- C#中String与 StringBuilder 的区别
- C++知识点41——运算符的重载概念与分数类实现(下)
- 记录一个超分辨率算法项目,来自B站
- mysql json 函数_MYSQL 开发设计表是硬邦邦的VARHCAR 还是JSON TYPE 来处理数据更香
- Pdf怎么转换excel表格,职场人士必备技能