关于二叉树的定义,网上有比较好的介绍,在这里就简单介绍二叉树的一些性质

二叉树的基本性质

1)二叉树的第i层上至多有 2^(i-1)(i ≥1)个结点;
2)深度为 h 的二叉树中至多含有 2^h – 1 个结点;
3)若在任意一棵二叉树中,有 n0 个叶子结点,有 n2 个度为 2 的结点,则:n0 = n2 + 1。

特殊形式的二叉树

1)满二叉树
特点:深度为h且含有2h-1个结点的二叉树,为满二叉树。图示满二叉树,结点编号为自上而下,自左而右。
2)完全二叉树(左图)
特点:指深度为k的,有n个结点的,且每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应,完全一致,则为完全二叉树。(右图)
3)平衡二叉树
特点:又称AVL树,它或为一棵空树,或具如下性质:其左子树和右子树都是平衡二叉树,且左、右子树的深度之差的绝对值不超过1。左、右子树的深度之差为平衡因子,平衡二叉树的平衡因子只能为0,-1,1。

关于二叉树的存储方式(顺序和链式存储)

(1) 顺序存储结构

用一组连续的存储单元存放二叉树的数据元素。结点在数组中的相对位置蕴含着结点之间的关系。
其所需的存储单元数为:2^h-1= 24-1 = 15,若父结点在数组中i下标处,其左孩子在2*i处,右孩子在2*i+1处。
(2)链式存储结构
链式存储结构的每个结点由数据域、左指针域和右指针域组成。左指针和右指针分别指向下一层的二叉树
             
放二叉树的数据元素。结点在数组中的相对位置蕴含着结点之间的关系

关于二叉树的三种遍历方式

(1)先序遍历(D L R): 访问根结点,按先序遍历左子树,按先序遍历右子树。
(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语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)相关推荐

  1. 【数据结构】理解二叉树的三种遍历--前序、中序、后序 +层序(简明易懂)

    一.易懂的形象理解 其实从名字就可以很好的理解这三种遍历,我在第二点时候说,但是估计能翻到我的文的同学们之前肯定看过好多类似的了,那咱们换个思路~ 先用我想的一种简单易懂的形象思维理解一下前序.中序. ...

  2. 二叉树----数据结构:二叉树的三种遍历及习题

    二叉树----数据结构:二叉树的三种遍历,利用递归算法. 关于二叉树的遍历,应用非常广泛,不单单是访问打印结点,还可以进行一系列的操作,如赋值.删除.查找.求二叉树的深度等等. 有递归和非递归两种算法 ...

  3. c语言二叉树的遍历菜单系统,C语言二叉树的三种遍历方式的实现及原理

    C语言二叉树的三种遍历方式的实现及原理 发布时间:2020-10-03 19:43:57 来源:脚本之家 阅读:63 作者:看雪. 二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个 ...

  4. c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理

    二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...

  5. 二叉树的三种遍历(递归与非递归) + 层次遍历

    <转载于  >>> > 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此 ...

  6. 详解二叉树的三种遍历方式(递归、迭代、Morris算法)

    详解二叉树的三种遍历方式(递归.迭代.Morris算法) 最重要的事情写在前面:遍历顺序不一定就是操作顺序!!! 递归解法 首先,一颗二叉树它的递归序列是一定的,导致其前中后序不同的原因只不过是访问节 ...

  7. 二叉树的三种遍历方式(递归、非递归和Morris遍历)

    二叉树的三种遍历方式(递归.非递归和Morris遍历) 原文:http://www.linuxidc.com/Linux/2015-08/122480.htm 二叉树遍历是二叉树的最基本的操作,其实现 ...

  8. 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历

    二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...

  9. python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)

    树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ######################P6.4 数据结构### ...

最新文章

  1. 问号和星号 php,星号和问号两个通配符
  2. 三种睡眠时间函数的区别:linux 的sleep()、usleep()、nanosleep()函数
  3. 常见的HTML元素及常见检查点
  4. 开发笔记- iOS监听某些事件的方法简单梳理
  5. C语言嵌入式系统编程修炼之道——背景篇
  6. linux将日期和日历信息追加到文件中_Linux常用指令
  7. Getting Contexts 获得上下文
  8. GitHub Actions 部署 VuePress 文档
  9. Python小项目(一)-----------计算体脂率
  10. 使用Redis来做浏览量统计
  11. Hibernate-部分知识点概述(持续更新)
  12. [Pyhon疫情大数据分析] 四.微博话题抓取及新冠肺炎疫情文本挖掘和情感分析
  13. 如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。编程计算并输出所有的n的所有情况。
  14. 计算标准累积正态分布_正态分布在用户等级划分的应用
  15. 2022:OFA: Unifying Architectures, Tasks, and Modalities through A Simple S2s Learning Framework
  16. Pytorch中DistributedSampler()中的随机因素
  17. 关于Node里面的pause和pauseSchedulerAndActions
  18. 联想ThinkPad E40安装XP及Ghost备份还原全记录
  19. java银行接口开发_银行接口开发,该如何解决
  20. [附源码]计算机毕业设计springboot海滨学院学生大创项目申报与审批系统

热门文章

  1. wcf 返回图片_WCF实现上传图片功能
  2. 行业短信 运营思路_飞信、易信之后 三大运营商要借5G再战微信
  3. java能应聘哪些职位_应聘java专员职位的面试题
  4. linux下glew例子,一个简单的GLSL Shader例子
  5. 重启网卡服务_Linux下查看不到物理网卡配置
  6. C#中String与 StringBuilder 的区别
  7. C++知识点41——运算符的重载概念与分数类实现(下)
  8. 记录一个超分辨率算法项目,来自B站
  9. mysql json 函数_MYSQL 开发设计表是硬邦邦的VARHCAR 还是JSON TYPE 来处理数据更香
  10. Pdf怎么转换excel表格,职场人士必备技能