C高级编程 第十六天(树 二叉树)

news2024/9/16 16:17:06

1.树

1.1结构特点

  • 非线性结构,有一个直接前驱,但可能有多个直接后继
  • 有递归性,树中还有树
  • 可以为空,即节点个数为零

1.2相关术语

  • 根:即根结点,没有前驱
  • 叶子:即终端结点,没有后继
  • 森林:即树的集合
  • 结点的度:直接后继的个数
  • 树的度:结点的度的最大值
  • 树的深度高度:结点的最大层数

1.3树的表示法

1.3.1图形表示法

1.3.2广义表表示法

1.3.3左孩子右兄弟表示法

将一颗多插树转化为二叉树,如下

其中,结点结构为

左结点为孩子结点,右节点为兄弟结点

2.二叉树

2.1定义

一个根节点和两棵不相交的二叉树组成,即1:2

2.2基本特征

每个节点最多有两棵子树——每个节点的度<=2

左子树和右子树的顺序不能颠倒——有序树

2.3二叉树性质

满二叉树:深度为k,有2^k-1个节点

完全二叉树:除最后一层,每一层节点数达到最大值,在最后一层只缺右边的若干节点

2.4二叉树的遍历

//单个结点
struct BinaryNode
{
	char ch;
	struct BinaryNode* lChild;
	struct BinaryNode* rChild;
};
void test()
{
	struct BinaryNode A = { 'A',NULL,NULL };
	struct BinaryNode B = { 'B',NULL,NULL };
	struct BinaryNode C = { 'C',NULL,NULL };
	struct BinaryNode D = { 'D',NULL,NULL };
	struct BinaryNode E = { 'E',NULL,NULL };
	struct BinaryNode F = { 'F',NULL,NULL };
	struct BinaryNode G = { 'G',NULL,NULL };
	struct BinaryNode H = { 'H',NULL,NULL };

	//创建节点之间的关系
	A.lChild = &B;
	A.rChild = &F;

	B.rChild = &C;

	C.lChild = &D;
	C.rChild = &E;

	F.rChild = &G;

	G.lChild = &H;

	//先序遍历
	printf("先序遍历\n");
	PreorderTraversal(&A);
	printf("中序遍历\n");
	InorderTraversal(&A);
	printf("后序遍历\n");
	PostorderTraversal(&A);
}

先序遍历:DLR

//DLR
void PreorderTraversal(struct BinaryNode* node)
{
	if (node == NULL)
	{
		return NULL;
	}

	printf("%c\n",node->ch);
	PreorderTraversal(node->lChild);
	PreorderTraversal(node->rChild);
}

中序遍历:LDR

//LDR
void InorderTraversal(struct BinaryNode* node)
{
	if (node == NULL)
	{
		return NULL;
	}

	InorderTraversal(node->lChild);
	printf("%c\n", node->ch);
	InorderTraversal(node->rChild);
}

后序遍历:LRD

//LRD
void PostorderTraversal(struct BinaryNode* node)
{
	if (node == NULL)
	{
		return NULL;
	}

	PostorderTraversal(node->lChild);
	PostorderTraversal(node->rChild);
	printf("%c\n", node->ch);
}

2.5统计二叉树的叶子数量

左孩子和右孩子都为空指针时,即为叶子结点

//统计叶子数量
void calculateLeadNum(struct BinaryNode* root, int* p)
{
	if (root == NULL)
	{
		return NULL;
	}

	if (root->lChild == NULL && root->rChild == NULL)
	{
		(*p)++;
	}
	calculateLeadNum(root->lChild, p);
	calculateLeadNum(root->rChild, p);
}

2.6统计二叉树的高度

比较左子树和右子树的高度,取最大的一个加一,即为树的高度

//计算树的高度
int calculateHeight(struct BinaryNode* root)
{
	if (root == NULL)
	{
		return NULL;
	}

	int lp = calculateHeight(root->lChild);
	int rp = calculateHeight(root->rChild);
	
	int height = lp > rp ? lp + 1 : rp + 1;
	return height;
}

2.7拷贝二叉树

  • 拷贝左子树
  • 拷贝右子树
  • 创建新节点
  • 将拷贝的左子树和右子树挂载到新节点上
  • 将新节点赋值
//拷贝二叉树
struct BinaryNode* copyTree(struct BinaryNode* root)
{
	if (root == NULL)
	{
		return NULL;
	}

	struct BinaryNode* lp=copyTree(root->lChild);
	struct BinaryNode* rp=copyTree(root->rChild);

	struct BinaryNode* newNode = malloc(sizeof(struct BinaryNode));
	if (newNode == NULL)
	{
		return;
	}
	newNode->lChild = lp;
	newNode->rChild = rp;

	newNode->ch = root->ch;

	return newNode;
}

2.8释放二叉树

  • 释放左子树
  • 释放右子树
  • 释放根节点
//释放二叉树
void releaseTree(struct BinaryNode* root)
{
	if (root == NULL)
	{
		return NULL;
	}

	releaseTree(root->lChild);
	releaseTree(root->rChild);
	printf("%c结点已被释放", root->ch);
	releaseTree(root);
}

2.9二叉树的非递归遍历

将每个节点设一个标志,默认false

(1)将根节点压入栈中

(2)进入循环(只要栈中元素个数大于0,进行循环操作)

  • 弹出栈顶元素
  • 若栈顶元素标志为true,输出此元素并执行下一次循环
  • 若栈顶元素标志为false,将节点标志设为true
  • 将该节点的右子树、左子树、根压入栈中
  • 执行下一次循环

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

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

相关文章

02-java实习工作一个多月-经历分享

一、描述一下最近不写博客的原因 离我发java实习的工作的第一天的博客已经过去了一个多月了&#xff0c;本来还没入职的情况是打算每天工作都要写一份博客来记录一下的&#xff08;最坏的情况也是每周至少总结一下的&#xff09;&#xff0c;其实这个第一天的博客都是在公司快…

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext)&#xff0c;和uboot一样&#xff0c;都是从汇编阶段开始的&#xff0c;因为对于kernel而言&#xff0c;还没进行栈的维护&#xff0c;所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。 内核起始部分代码被解压代码调用&#xff0c…

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qK…

Java 入门指南:JVM(Java虚拟机)—— Java 内存运行时的数据区域

前言 对于 Java 程序员来说&#xff0c;在虚拟机自动内存管理机制下&#xff0c;不再需要像 C/C程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作&#xff0c;不容易出现内存泄漏和内存溢出问题。 由于程序员把内存控制权利交给 Java 虚拟机&#xff0c;一旦…

【CSS in Depth 2 精译_025】4.3 弹性布局的方向

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

NISP 一级 | 2.3 身份认证

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;身份认证基本方法 身份认证是用户登录系统或网站面对的第一道安全防线&#xff0c;如输入账号口令来登录。身份认证是在网络中确认操作者身份的过程。身份认证一般依据以下三种情…

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html Thread Index和Thread ID之间有什么关系呢&#xff1f;&#xff08;线程架构参考这里&#xff1a;CUDA C Programming Guide (nvidia.com)open in new window&#xff09; 1维的Thread Index&am…

ORCAD出BOM--位号在同一个Excel格子里

所有相同属性的器件都在同一个格子里 Tools\ Bill of Materials, 注意勾选Open in excel. 勾选Open in excel, 所有相同属性的器件都在同一个格子里 不勾选Open in excel, 5个相同属性的器件都在同一个格子里

代码随想录Day 39|打家劫舍问题,leetcode题目:198.打家劫舍、213.打家劫舍Ⅱ、337.打家劫舍Ⅲ

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一&#xff1a;198.打家劫舍解题思路&#xff1a; 题目二&#xff1a;213.打家劫舍II解题思路&#xff1a; 题目三&#xff1a; 337.打家劫舍 III解题思路暴力递归记忆化递推动态规划 总结…

Linux基础2-权限2(操作权限,粘滞位,umask,目录文件的rwx权限)

上篇内容&#xff1a;Linux基础2-权限1(用户&#xff0c;权限是什么&#xff1f;)-CSDN博客 目录 一. 权限的操作&#xff08;命令&#xff09; 1.1 chmod 1.2 chown 1.3 chgrp 二. 粘滞位 三. umask&#xff08;遮掩码&#xff09; 四. 目录文件的 r w x 权限 一. 权限…

数据库的操作:SQL语言的介绍

一.前言 SQL是一种结构化查询语言。关系型数据库中进行操作的标准语言。 二.特点 ①对大小写不敏感 例如&#xff1a;select与Select是一样的 ②结尾要使用分号 没有分号认为还没结束; 三.分类 ①DDL&#xff1a;数据定义语言&#xff08;数据库对象的操作&#xff08;结…

服务器重装系统,数据备份 容器备份

文章目录 1.前言2.docker备份2.1 容器备份2.2 镜像备份2.3 数据卷备份 3.docker安装4.jdk安装5.导入镜像6.导入容器 本文档只是为了留档方便以后工作运维&#xff0c;或者给同事分享文档内容比较简陋命令也不是特别全&#xff0c;不适合小白观看&#xff0c;如有不懂可以私信&a…

【最新华为OD机试E卷-支持在线评测】计算疫情扩散时间(200分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

DDComponentForAndroid:探索Android组件化方案

在现代Android应用开发中&#xff0c;随着应用规模的不断扩大&#xff0c;传统的单体应用架构已经无法满足快速迭代和维护的需求。组件化架构作为一种解决方案&#xff0c;可以将应用拆分成多个独立的模块&#xff0c;每个模块负责特定的功能&#xff0c;从而提高代码的可维护性…

2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)

引言 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;是连接人类与机器的重要桥梁。随着技术的不断进步&#xff0c;我们见证了从简单的文本分析到复杂的语言理解的转变。ChatGPT&#xff0c;作为自然语言处理领域的一个里程碑&#xff0c;其发展历程不仅…

【C/C++】C++程序设计基础(继承与派生、多态性)

目录 八、继承与派生8.1 派生类的引入与特性8.2 单继承8.3 同名成员的访问方式8.4 赋值兼容规则8.5 单继承的构造与析构8.6 多继承 九、多态性9.1 运算符重载9.2 虚函数9.3 纯虚函数与抽象类 八、继承与派生 8.1 派生类的引入与特性 -继承:一旦指定了某种事物父代的本质特征&a…

线程相关内容

线程 一、介绍二、thread库1、构造函数&#xff08;1&#xff09;函数&#xff08;2&#xff09;说明&#xff08;3&#xff09;注意 2、join函数3、detach4、joinable函数5、get_id函数 三、mutex的种类1、mutex&#xff08;1&#xff09;介绍&#xff08;2&#xff09;lock&a…

vant UI之van-tab如何实现标题两行显示

前言&#xff1a; 相必大家在开发移动端或者小程序时都会见到如下设计稿 这个时候大家基本上都会想到使用vant UI 的van-tab组件&#xff0c;如果实现不了那就自己封装一个tab组件这样的情况。 其实使用van-tab是可以实现的&#xff0c;不过要借助van-tab的一系列api和css&…

数据结构(2):LinkedList和链表[1]

下面我们来介绍一种新的数据结构&#xff0c;链表。 我们曾经讨论过顺序表。它的数据存储在物理和逻辑上都是有逻辑的。而我们今天要学习的链表&#xff0c;则在物理结构上非连续存储&#xff0c;逻辑上连续。 1.链表的认识 链表由一个一个的节点组成。 我们可以想象一列火…

乐鑫安全制造全流程

主要参考资料&#xff1a; 【乐鑫全球开发者大会】DevCon24 #10 &#xff5c;乐鑫安全制造全流程 乐鑫官方文档Flash加密: https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/security/flash-encryption.html 【ESP32S3】使用 Flash 下载工具完成 Flash 加密功能…