【数据结构】——二叉树功能

news2024/11/30 5:45:36

前言:我们前面已经了解了二叉树的一些概念,那么我们今天就来了解下二叉树的遍历实现和一些性质。

在这里插入图片描述

二叉树的遍历方式有三种:前序中序后序

前序:先根节点,再左子树,最后右子树。
中序:先左子树,再根节点,最后右子树。
后序:先左子树,再右子树,最后根节点。

前序遍历:

void PrevOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	printf("%d ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

如果我们的根节点为空就返回空,不为空就递归左子树,如果左子树为空就返回递归访问右子树。

中序遍历:

void InOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

先访问遍历左子树,再根节点,最后在访问右子树。

后序遍历:

void Tailorder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N");
		return;
	}
	Tailorder(root->left);
	Tailorder(root->right);
	printf("%d", root->data);
}

先遍历左子树,再遍历右子树,最后在根节点。

求二叉树节点个数:

int TreeSize(TreeNode* root)
{
	return root == NULL ? 0 :
		TreeSize(root->left) +
		TreeSize(root->right) + 1;
}

我们递归实现,左子树的节点个数加上右子树的节点个数再加上根节点的个数就是节点的总个数。
在这里插入图片描述

求叶子结点的个数:

int TreeLeafSize(TreeNode* root)
{
	// 空 返回0
	if (root == NULL)
		return 0;
	// 不是空,是叶子 返回1
	if (root->left == NULL
		&& root->right == NULL)
		return 1;

	// 不是空 也不是叶子  分治=左右子树叶子之和
	return TreeLeafSize(root->left) +
		TreeLeafSize(root->right);
}

求二叉树的高度:

int TreeHeight(TreeNode* root)
{
	if (root == NULL)
		return 0;
	int leftHeight = TreeHeight(root->left);
	int rightHeight = TreeHeight(root->right);

	return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

因为我们的递归结合上三目操作符会使得非常的复杂,所以我们用一个数据来保存左右子树的高度,我们的二叉树的高度为左右子树较高的那个子树加上1,所以我们返回的是左右子树高度更高的再加上1就是二叉树的高度。

我们的代码还可以进行改进,我们C语言的fmax函数:该函数的作用是比较两个数得到较大的那一个数

int TreeHeight(TreeNode* root)
{
	if (root == NULL)
		return 0;

	return fmax(TreeHeight(root->left), TreeHeight(root->right)) + 1;
}

二叉树查找值为x的节点:

// 二叉树查找值为x的结点
TreeNode* TreeFind(TreeNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;

	if (root->data == x)
		return root;

	TreeNode* ret1 = TreeFind(root->left, x);
	if (ret1)
		return ret1;

	TreeNode* ret2 = TreeFind(root->right, x);
	if (ret2)
		return ret2;

	return NULL;
}

销毁二叉树:

void DestroyTree(TreeNode* root)
{
	if (root == NULL)
		return;

	DestroyTree(root->left);
	DestroyTree(root->right);
	free(root);
}

求二叉树第k层节点个数:

int TreeLevelK(TreeNode* root, int k)
{
	assert(k > 0);
	if (root == NULL)
		return 0;

	if (k == 1)
		return 1;

	return TreeLevelK(root->left, k - 1)
		+ TreeLevelK(root->right, k - 1);
}

第k层的节点等于第k-1层的节点数相加。
在这里插入图片描述
现在我们要求第三层的节点数,相当于我们返回它的第二层,而我们的第二层节点数要返回我们的第一层节点数,我们的左子树返回一个节点,右子树返回两个节点,所以就是三个节点。

如果对大家有所帮助的话就支持一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1299722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python画动漫形象(魔法少女小圆晓美焰,super beautiful)

1.源代码 import turtle as te import time WriteStep 15 # 贝塞尔函数的取样次数 Speed 5 Width 600 # 界面宽度 Height 500 # 界面高度 Xh 0 # 记录前一个贝塞尔函数的手柄 Yh 0 def Bezier(p1, p2, t): # 一阶贝塞尔函数 return p1 * (1 - t) p2 * t def Bezier_2(x1…

关于mysql高版本使用groupby导致的报错

在开发时,遇到mysql版本在5.7.X及以上版本时使用group by 语句会报以下的错误 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column business_typ…

Android:The emulator process for AVD Pixel_2_API_29 was killed

The emulator process for AVD Pixel_2_API_29 was killed 报错描述: 第一次安装Android studio好不容易解决gradle启动模拟器又出现了以下错误 The emulator process for AVD Pixel_2_API_29 was killed原因一: 需要安装Intel x86 Emulator Acceleer…

2023济南大学acm新生赛题解

通过答题情况的难度系数&#xff1a; 签到&#xff1a;ACI 铜牌题&#xff1a;BG 银牌题&#xff1a;EF 金牌题&#xff1a;DHJKO 赛中暂未有人通过&#xff1a;LMNP A - AB Problem 直接根据公式计算就行。 #include<stdio.h> int main(){int a,b;scanf("%…

【Docker】Docker Compose,yml 配置指令参考的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Python ZeroMQ编程 网络通信协议详细说明和教程

ZeroMQ概述 ZeroMQ&#xff08;又名MQ&#xff0c;MQ&#xff0c;或zmq&#xff09;像一个可嵌入的网络库&#xff0c;但其作用就像一个并发框架。 ZeroMQ类似于标准Berkeley套接字&#xff0c;其提供了各种传输工具&#xff0c;如进程内、进程间、TCP和组播中进行原子消息传送…

数据结构与算法-Rust 版读书笔记-1语言入门

数据结构与算法-Rust 版笔记 一、语言入门 1、关键字、注释、命名风格 目前&#xff08;可能还会增加&#xff09;39个&#xff0c;注意&#xff0c;Self和self是两个关键字。 Self enum match super as extern mod trait async false …

SOP(标准作业程序)和WI(操作指导书)的联系和区别

目录 1.SOP&#xff08;标准作业程序&#xff09;&#xff1a;2.WI&#xff08;操作指导书&#xff09;&#xff1a;3.SOP和WI的区别&#xff1a; 1.SOP&#xff08;标准作业程序&#xff09;&#xff1a; SOP: 所谓SOP&#xff0c;是 Standard Operation Procedure三个单词中…

CF1898C Colorful Grid(构造)

题目链接 题目大意 n 行 m 列 的一个矩阵&#xff0c;每行有m - 1条边&#xff0c;每列有 n - 1 条边。 问一共走 k 条边&#xff0c;能不能从 &#xff08;1&#xff0c; 1&#xff09;&#xff0c;走到&#xff08;n&#xff0c; m&#xff09;&#xff0c;要求该路径上&am…

【nodejs升级版本】win10 nodejs版本低升级版本流程

首先 网上说的n模块不支持window系统&#xff01;&#xff01;&#xff01; window系统升级node只能到node官网下载window安装包来覆盖之前的node 升级步骤如下&#xff1a; 1&#xff0c;找到你node的安装路径&#xff0c;不知道的可以cmd命令行中输入这个命令就可以看到了…

智能优化算法应用:基于正余弦算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于正余弦算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于正余弦算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.正余弦算法4.实验参数设定5.算法结果6.参考文…

uc_14_IP地址_套接字_字节序转换

1 计算机网络 计算机网络&#xff0c;是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 网络协议是一种特…

【Vulnhub 靶场】【Hackable: III】【简单 - 中等】【20210602】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hackable-iii,720/ 靶场下载&#xff1a;https://download.vulnhub.com/hackable/hackable3.ova 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年06月02日 文件大小&#xff1a;1.6 GB 靶场作者&…

IDEA如何运行SpringBoot+Vue前后端分离的项目(超详细截图)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

电源小白入门学习1——电源系统架构和相关指标

电源小白入门学习1——电源系统架构和相关指标 电源系统架构电源系统的指标及测量方法电源的效率电源的静态电流输出电压调整率纹波测量的注意事项动态负载测试 在开始本期内容之气&#xff0c;我先简单介绍一下我们电源小白学习系列内容&#xff1a;首先我是一个嵌入式小白&am…

c语言希尔排序总结(详解)

希尔排序&#xff1a; 1&#xff1a;分组插入排序两两分组降低元素个数提高插入的效率&#xff0c;先分组对每一组分别进行插入排序 希尔排序是插入排序的一种改进算法&#xff0c;也称为缩小增量排序。其基本原理是通过将待排序的序列分成若干个子序列&#xff0c;对每个子序…

二叉树算法专栏一《理论基础》

下面我会介绍一些我在刷题过程中经常用到的二叉树的一些基础知识&#xff0c;所以我不会教科书式地将二叉树的基础内容通通讲一遍。 二叉树的种类 在我们解题过程中二叉树有两种主要的形式&#xff1a;满二叉树和完全二叉树。 满二叉树 满二叉树是一种特殊的二叉树&#xf…

优麒麟ubuntukylin安装UE4.27.2

优麒麟ubuntukylin安装UE4.27.2 在&#xff08;国产&#xff09;优麒麟 ubuntukylin Linux平台上编译测试安装虚幻引擎。 优麒麟系统 这里选择的是官方增强版 https://www.ubuntukylin.com/downloads/ 同样的可以选择对应的Ubuntu22.04 LTS&#xff0c;唯一的区别就是优麒麟…

java--Math、System、Runtime

1.Math 代表数字&#xff0c;是一个工具类&#xff0c;里面提供的都是对数据进行操作的一些静态方法。 2.Math类提供的常见方法 3.System System代表程序所在的系统&#xff0c;也是一个工具类。 4.System类提供的常见方法 5.时间毫秒值 值的是从1970年1月1日 00:00:00走到…

Realme X7 Pro Root 刷机教程

Realme X7 Pro 刷机教程 Just For Fun&#xff0c;最近倒腾了下Realme X7 Pro 刷root。此博客为个人记录刷机过程&#xff0c;如有机友跟随本教程操作&#xff0c;请谨慎操作&#xff01;&#xff01;&#xff01; 以下教程真针对Realme X7 Pro&#xff0c;其他版本方法未知&…