二叉树的链式结构和递归程序的递归流程图

news2024/11/15 11:35:25

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前学习二叉链。
在这里插入图片描述
普通二叉树的增删查改没有意义。如果是为了存储数据,线性表更简单,二叉树更复杂,并且插入删除也不好定义。有意义的是通过二叉树引出搜索树,搜索树又有AVL树和红黑树。再搜索树中查找一个节点最多找高度次。

深度优先:前中后序遍历 一般借助递归
广度优先:层序遍历 一般借助队列

typedef char BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;
 // 二叉树前序遍历 递归
void PrevOrder(BTNode* root)
{
	if(root == NULL)
	{
		printf("NULL ");
		return;
	}
	// 根 左 右子树 递归 递归过程图在下方
	printf("%c ",root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}
 // 二叉树中序遍历
void InOrder(BTNode* root)
{
	if(root == NULL)
	{
		printf("NULL ");
		return;
	}
	// 左 根 右子树 递归 递归过程图在下方
	InOrder(root->left);
	printf("%c ",root->data);
	InOrder(root->right);
}
 // 二叉树后序遍历
void PostOrder(BTNode* root)
{
	if(root == NULL)
	{
		printf("NULL ");
		return;
	}
	// 左 右 根 递归 递归过程图在下方
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%c ",root->data);
}
// 求节点的个数
int TreeSize(BTNode* root)
{
	// root不是NULL,则个数为左节点个数+右节点个数+1(加的1就是对本节点个数加上去)
	return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
// 求叶子结点的个数 
// 1.NULL return 0 2.叶子 return 1 3.非空且不是叶子 reutrn 左子树叶子节点个数+右子树叶子节点个数
int TreeLeefSize(BTNode* root)
{
	if(root == NULL)
		return 0;
	if(root->left == NULL && root->right == NULL)
		return 1;
	return TreeLeefSize(root->left) + root->left(root->right);
}
// 求第K层节点的个数 设K=3 化解为左子树的第K-1(2)层和右子树的第k -1(2)层
int TreeKLeefSize(BTNode* root, int k)
{
	if(root == NULL)
		return 0;
	if(k == 1)
		return 1;
	return TreeKLeefSize(root->left, k-1) + TreeKLeefSize(root->right, k-1);
}
// 查找树里面值为X的那个节点 1.root == NULL return NULL 
// 2.root 不是要找的 先找左树 左树如果没有再找右树 3.左右都没有则当前树没找到 return null
BTNode* TreeFind(BTNode* root, BTDataType x)
{
	if(root == NULL)
		return NULL;
	
	// 我就是x则返回
	if(root->data == x)
	{
		return root;
	}
	
	// 不是x先在左边找再在右边找
	BTNode* lret = TreeFind(root->left, x); // 找到了返回root 没找到返回NULL
	if(lret)
		return lret;
		
	BTNode* rret = TreeFind(root->right, x); // 找到了返回root 没找到返回NULL
	if(rret)
		return rret;
		
	// 左右都没找到
	return NULL;
}
// 二叉树销毁 形参的改变不会影响实参,因此需要二级指针
void BinaryTreeDestory(BTNode** pproot)
{
    // if(*pproot == NULL)
	// 	return;
	// BinaryTreeDestory(&(*pproot)->left); //先将二级指针转换为一级再取地址变为2级传参
	// BinaryTreeDestory(&(*pproot)->right);
	// free(*pproot);
	// *pproot== NULL;
}
// 一级指针的做法 存在野指针,需要将野指针置空 保持接口一致性
void BinaryTreeDestory(BTNode* root)
{
	if(root == NULL)
		return;
	BinaryTreeDestory(root->left); //先将二级指针转换为一级再取地址变为2级传参
	BinaryTreeDestory(root->right);
	free(root);
}
// 创建节点
BTNode* CreateTreeNode (BTDataType x)
{
	BTNode* n1 = (BTNode*)malloc(sizeof(BTNode));
	n1->data = x;
	n1->left = NULL;
	n1->right = NULL:
	return node;
}
int main()
{
	// 手动连接上图中的树
	BTNode* A = CreateTreeNode('A');
	BTNode* B = CreateTreeNode('B');
	BTNode* C = CreateTreeNode('C');
	BTNode* D = CreateTreeNode('D');
	BTNode* E = CreateTreeNode('E');
	BTNode* F = CreateTreeNode('F');
	A->left = B;
	A->right = C;
	B->left = D;
	C->left = E;
	c->right = F;
	// 二级做法BinaryTreeDestory(&A);
	// 一级做法
	BinaryTreeDestory(A);
	A = NULL;
}

下图为PrevOrder的递归过程图。函数调用该板块完成后会返回到使用该板块的语句。前中后序的本质是一样的,就是打印的时机不同。
在这里插入图片描述

  1. 求节点的个数(前序) 1+左树节点个数+右树节点个数
  2. 求树的高度(后序) max(左树的高度,右树的高度)+1

深度优先:前中后序遍历 一般借助递归
广度优先:层序遍历 一般借助队列

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

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

相关文章

一个基于VB的期刊信息管理系统

一个基本的期刊信息管理系统的示例,使用 Visual Basic (VB.NET) 编写。这个示例将展示如何创建一个简单的期刊信息管理系统,其中包括添加、查看、编辑和删除期刊的功能。 系统需求 添加期刊:允许用户输入期刊的信息(如标题、作者…

面试官问:你如何处理与同事或上级的分歧?【无标题】

面试官问:你如何处理与同事或上级的分歧? 当面试官问你如何处理与同事或上级的分歧,其实面试官的目的是评估你的沟通技巧、冲突解决能力和团队合作的能力。在一起共事,就一定有分歧发生,有争执是正常的,关…

OpenCV 1

前言:开新坑辽,, 目录 计算机眼中的图像 视频的读取与处理 ROI区域 边界填充 数值计算 腐蚀操作 膨胀操作 开运算与闭运算 梯度计算 礼貌与黑帽 Sobel算子 梯度计算方法 scharr与laplacian 计算机眼中的图像 灰色图片&#xff0…

ROS第四梯:ROS项目中添加自定义类

第一步,ROS项目结构介绍 工作空间中包含一个名为pcl_ros_test的功能包,其中main.cpp是原有项目自带的,接下来以CommonAlg自定义类添加为例进行介绍。 第二步:头文件CommonAlg.h创建和编写,并保存在include/pcl_ros_tes…

达梦数据库导入xml迁移到达梦数据库大文件导致中断问题解决方案记录?

问题:我将同事给我的xml文件迁移到盗梦数据库,xml文件大约2G,在导入过程中,总是导入一半都不到就失败了。 原因:我的原因是我的电脑的系统的运行内存是16G的,后来我发现在没导入之前,其他进程已…

GUI编程18:文本框、密码框、文本域

视频链接:20、文本框、密码框、文本域_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p20&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.文本框 示例代码: package com.yundait.lesson06;import javax.swing.*; import java.a…

初始分布式系统和Redis特点(

(一)认识redis Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperlog…

『功能项目』QFrameWorkBug修改器界面【65】

我们打开上一篇64QFrameWork道具栏物品生成的项目, 本章要做的事情是做一个道具bug调试面板,可以增加主角属性,可以增加道具的功能 首先创建一个空物体(钉子) 按住Alt键将空物体钉到左侧 重命名为Left 创建Button、Im…

基于SpringBoot+Vue的企业会议室预定管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

Qt实战案例(60)——利用QTimer类实现实时时间功能

目录 一、项目介绍二、项目基本配置三、UI界面设置四、主程序实现4.1 widget.h头文件4.2 widget.cpp源文件 五、效果演示 一、项目介绍 本文介绍利用QTimer类实现实时时间功能并在状态栏中进行显示。 二、项目基本配置 新建一个Qt案例,项目名称为“TimeTest”&am…

阿里通义千问开源Qwen2.5系列模型:Qwen2-VL-72B媲美GPT-4

通义千问团队近日重磅宣布,继其Qwen2模型发布仅三个月后,再次推出Qwen家族的全新成员——Qwen2.5系列语言模型,并已全面开源。这次开源行动堪称史上规模之最,涵盖了通用型Qwen2.5,以及专为编程和数学领域打造的Qwen2.5…

如何使用ssm实现基于ssm框架的车辆出租管理系统+vue

TOC ssm643基于ssm框架的车辆出租管理系统vue 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域…

【python】【绘制小程序】动态爱心绘制

背景介绍 参考链接:https://blog.csdn.net/Python_HUHU/article/details/139703289点的背景颜色在开始修改;文字的颜色在最后修改。文字内容可以修改。 python 代码 import tkinter as tk import random from math import sin, cos, pi, log from PIL…

机房监控运维工作的全面优化:以监控易一体化运维软件为助力

在当今高度信息化的社会,数据中心的运维工作显得尤为重要。为了确保机房环境的稳定、服务器和存储设备的正常运行、操作系统和数据库的持续高效,以及中间件服务的可靠性,运维团队需要执行一系列精细化的管理和操作。本文将以监控易一体化运维…

计算机网路(应用层)

客户/服务方式(C/S)方式和对等方式(P2P方式) 客户/服务器方式(Client/Server,C/S)方式 客户/服务器是指通信中所涉及的两个应用进程。 客户/服务器方式所描述的是进程之间的服务和被服务的关…

【STL】priority_queue 基础,应用与操作

c在C的标准模板库(STL)中,priority_queue 是一个基于堆的容器适配器,用于实现优先级队列。它本质上是一个最大堆(Max-Heap),即每次取出元素时,始终取出优先级最高的元素。本文将详细…

VulnHub-Bilu_b0x靶机笔记

Bilu_b0x 靶机 概述 Vulnhub 的一个靶机,包含了 sql 注入,文件包含,代码审计,内核提权。整体也是比较简单的内容,和大家一起学习 Billu_b0x.zip 靶机地址: https://pan.baidu.com/s/1VWazR7tpm2xJZIGUS…

Java Web服务运行一段时间后出现cpu升高导致的性能下降问题排查

背景 有个web服务,运行一段时间后,出现cpu逐渐占用高,服务处理请求整体性能下降问题。 异常情况时, 同时jvm的cpu上涨 最终表现为,处理内部逻辑执行耗时变高。 排查原因 原来服务的jvm启动参数带了 -XX:-TieredCom…

云上办公项目总结

云尚办公系统是一套自动办公系统,系统主要包含:管理端和员工端 管理端包含:权限管理、审批管理、公众号菜单管理 员工端采用微信公众号操作,包含:办公审批、微信授权登录、消息推送等功能 项目服务器端架构&#xff…

动手学习RAG:大模型重排模型 bge-reranker-v2-gemma微调

动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG:rerank模型微调实践 bge-reranker-v2-m3动手学习RAG:迟交互模型colbert微调实践 bge-m3动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct动手学…