入门二叉树,三种遍历,计算结点个数 ,深度 叶子结点个数,第k层结点个数
1.关于二叉树的前中后序快速排序
那就在这里拿这张图来演示一下怎样快速写出中序遍历,我们都知道中序遍历是,左子树,根,右子树
B A C
D E F
H
- 最后直接得出结果DBEHACF
2.二叉树的五种基本结构
拿代码表示:
typedef struct Node{int value;struct Node *left; //既是左孩子,又同时代表着整颗左树struct Node *right; //既是右孩子,又代表整颗右树
}void PreorderTraversal(Node *root) { //定义一个函数,将一个树的根传进去if (root==NULL){return ; //如果传进去的树为空树,那么直接返回
}printf ("%d",root->value); //否则打印根PreorderTraversal(root->left) //打印完根然后只有左或者右不为空才会继续进行这两步,将左右子树作为根传进去PreorderTraversal(root->right)
}
关于递归函数,当函数执行完之后要是还被嵌套于其他函数中,则当前函数执行完毕,返回上一层函数继续执行,没有执行完的部分
//二叉树的前序遍历
int *p;
int size;
void _preorder(struct TreeNode *root){
if (root==NULL)
return ; //根
p[size++]=root->val;
_preorder(root->left); //左子树
_preorder(root->right); //右子树
}int *preorderTraversal(struct TreeNode *root,int *returnSize){
p=(int *)malloc(sizeof(int)*100*10000); //开辟一块空间
size=0;
_preorder (root);
*returnSize=size;
return p;
}
其实上面这段代码写的其实有一点繁琐,上面这段代码是靠返回值来打印整个树的,其实我们不必这样来打印一颗树,看下面这段代码,比较简单易懂。
void preorder(struct *root){
if (root==NULL)
return ;
printf ("%d",root ->value); //根
preorder (root->left); //左子树
preorder(root->right); //右子树
}
中序遍历其实和前序遍历都一样,只需要改变一点就可以了,前序遍历在我们创建的函数里面先是根再是左子树,再是根,接着才是右子树,所以我们在了解到,前序和中序的区别之后,我们就了解到,只需要把,前序遍历的顺改变就可以了,顺序为,左子树,根,右子树
void preorder(struct *root){
if (root==NULL)
return ;
preorder (root->left); //左子树
printf ("%d",root ->value); //根
preorder(root->right); //右子树
}
计算一棵树的结点个数,有两个思路,一个就是遍历,遍历的时候不为空,则结点个数加一,另外一个就是通过递归返回值来计算节点个数。
这里本人英文不是很好,函数名就拿拼音代替了
int size=0;
void jisuanjiediangeshu(struct *root){
if (root==NULL)
return ;
size++ //结点不为空则自增一
jisuanjiediangeshu(root->left); //左子树
jisuanjiediangeshu(root->right);//右子树
}
递推方式
int size(Node *root){
if (root ==NULL)
return 0;
size(root->left);
size(root->right);
return left+right+1;
}
利用递推公式来求叶子结点个数
int LeafSize(Node *root){
if(root==NULL)
return 0;
if (root->left==NULL&&root->right==NULL){
return 1;
}
LeafSize(root->left);
LeafSize(rroot->right);
return left+right;
}
求二叉树高度
int GetHeight (Node *root)
{
if (root==NULL)
return 0;
int left=GetHeight(root->left);
int right=GetRight(root->right);
return (left>right?left:right)+1;
}
关于二叉树这一块的递归都是,代码好写,也比较好理解,要仔细去体会每一个返回值,刚开始看的时候可能会有一点蒙蔽,边画图边理解,是一个不错的主意。
求第k层结点个数
int GetKLevelSize(Node *root,int k){
if (root==NULL)
return 0;
if (k===1)
return 1;
return GetKLevelSize(root->left, k-1)+GetKLevelSize(root->right, k-1);
}//这个比较难理解,下去要慢慢理解
//二叉树结点中所有value都不重复
//找结点的value是v的结点
//如果找到了,返回v所在的地址
//如果没找到,返回NULL
//find返回NULL意味着没找到,返回非NULL,意味着找到了
//先确定根结点->左子树中是否包含-右子树中是否包含
//如果根结点就是,那么就不需要去左右子树查找
//如果 左子树找到就不需要去右子树找了
Node *Find(Node *root,int v){
if (root==NULL)return 0;
if (root->value==v)return root;
Node *result=Find(root->left,v);if (result!=NULL)return result;
Node *result=Find(root->right);if(result!=NULL)return result;
else{return NULL;}
}
入门二叉树,三种遍历,计算结点个数 ,深度 叶子结点个数,第k层结点个数相关推荐
- 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现
剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...
- 一文弄懂二叉树三种遍历
作者 | 菠了个菜 责编 | 屠敏 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次. 在二叉树的遍历中存在三种较为常用的遍历方式:前序遍历.中 ...
- 二叉树三种遍历方式的非递归实现
树的递归实现方式很简单,下面介绍三种遍历的非递归实现. 树的遍历有个特点,那就是在处理具体问题时,绝大多数情况下是在当前循环.或函数(或是子树)的根节点来处理的,能够注意到当前根节点是如何从上个根节点 ...
- 二叉树三种遍历方式,先序、中序、后序
二叉树遍历方式分为三种:先序,中序和后序. 可以以根节点的位置为参考来记遍历方式,在第一个为先序,中间为中序,最后为后序: 即:先序: 根左右:中序:左根右:后序:左右根. 借个图: 之前看过一个视频 ...
- 二叉树三种遍历(递归以及非递归实现)
package com.shiyeqiang.tree;import java.util.Stack;public class BiTree {public static void main(Stri ...
- 二叉树的前序中序后序三种遍历方式及递归算法介绍
二叉树三种遍历方式 二叉树的遍历是整个二叉树的核心,二叉树的几本操作都要依赖于遍历,对于二叉树的遍历,递归是最简单也最容易理解的,本文详细介绍了二叉树的三种遍历方法,并用递归来实现: 完整的可调试代码 ...
- 求二叉树中结点个数代码java_求二叉树中第K层结点的个数
一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...
- 【数据结构】二叉树的节点总个数、叶子节点个数、第K层节点个数、二叉树的深度
目录 1.结点总个数 1.1 局部静态变量法 思维 代码 不足之处 2.传指针法 程序代码 3.递归法 思想 程序代码 详细过程 2.叶子节点个数 思想 程序代码 3.第K层节点个数 思想 程序代码 ...
- c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理
二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...
最新文章
- 推荐算法的先验算法的连接_数据挖掘专注于先验算法
- java.util.UnknownFormatConversionException: Conversion = ‘,‘ 解决
- python爬取elasticsearch内容
- Redis核心配置_Redis高级数据类型使用
- uselocale_Java扫描仪useLocale()方法与示例
- 网络协议:TCP连接管理
- SAP License:SAP S/4HANA Cloud [ERP 云]
- 整个技术架构结构设计
- 12. 星际争霸之php设计模式--模板模式
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_12_创建多线程程序的第二种方式_实现Runnable接口...
- 前端饿了么UI messageBox二次封装,防止重复弹窗
- linux如何部署btsync同步?
- 太阳高度角计算题_正午太阳高度角的计算及应用
- ENVI遥感图像监督分类与出图制作
- web音视频播放器(html5)方案总结
- android studio实现动画,android studio上的基本动画实现(第一篇)
- Element UI(一)
- vue-shop 表格中使用树形控件 vue-table-width-tree-grid
- 网络游戏网络封包破解
- 微积分入门(SXT版)
热门文章
- java如何返回一个空数组?
- IT项目经理的个人知识管理(转)
- 俄罗斯、乌克兰程序员薪资曝光!年薪 15w+,女程序员比男程序员收入高
- php 聚合广告平台,GitHub - mystudytime/easy-amazon-advertising: 基于 amazon advertising v2 接口的 PHP 广告信息组件...
- 如何官网下载Eclipse历史版本
- 如何利用Python编程批量处理Excel来提高日常工作效率!
- Jenkins基础:获取Jenkins-Crumb的错误信息与对应方法
- android tips 8 | mystra,Mystra是什么意思
- aliyun的产品都是有哪些,主要是做什么的呢?
- 折弯公差尺寸及工艺要求