第五章 树与二叉树

news2024/11/26 2:52:37

一、数据结构定义

  1. 二叉树的顺序存储结构
  2. 二叉树的链式存储结构(即二叉链表)(因为有两个指针所以是二叉链表,如果再加一个指向父节点的指针就是三叉链表)
    typedef struct BTNode{ // BT即Binary Tree,二叉树
    	int val;
    	struct BTNode *left, *right;
    } BTNode, *BTree;
    
  3. 线索二叉树的存储结构
    typedef struct ThreadBTNode{ // 线索二叉树
    	int val;
    	struct ThreadBTNode *left, *right;
    	bool ltag, rtag; // ltag和rtag为0表示有孩子,为1表示无孩子指向前驱/后继
    } ThreadBTNode, *ThreadBTree;
    
  4. 树的存储结构(不是上面说的二叉树,是可能有多个孩子的树)
    • 双亲表示法(节点仅保存其父节点信息,通过一个节点只能很快找到它的祖先。因此需要通过数组保存所有节点,才能实现对其遍历等操作,且效率较低,所以双亲表示法一般仅用在特殊场合,如并查集)
      typedef struct{
      	ElemType data;
      	int parent; // 存储其父节点在数组中存储的位置下标
      } PTNode;
      
      typedef struct{
      	PTNode *nodes;
      	int n;
      } PTree;
      
    • 孩子表示法(用一个数组存储所有节点,每个节点内存一个链表节点指针,指向其第一个孩子。链表节点内部保存两个域:孩子的下标和指向下一个孩子对应的链表节点的指针。孩子表示法可以很快找到所有孩子节点,但寻找双亲时必须遍历整棵树,效率较低)
      请添加图片描述
      typedef struct CCNode{
      	int child; // 存储该孩子节点在数组中存储的位置下标
      	struct CCNode *next;
      } CCNode;
      
      typedef struct{
      	ElemType data;
      	CCNode *firstChild;
      } TreeNode; 
      
      typedef struct{
      	TreeNode *nodes;
      	int n;
      } CTree;
      
    • 孩子兄弟表示法
      • 可通过节点的左指针找到节点的第一个孩子,沿孩子的右指针可以找到该节点的所有孩子。孩子表示法中有组成树本身的节点和孩子链表节点共两种节点,孩子兄弟表示法通过两个指针,将孩子表示法中两种节点合为一种
      • 因为是两个指针,所以孩子兄弟表示法的树是以二叉链表作为存储结构的
      typedef struct CSNode{
      	ElemType data;
      	struct CSNode *firstChild, *nextSibling;
      } CSNode, *CSTree;
      
  5. 二叉排序树节点定义(与普通二叉树一致)
    struct BSTNode{
    	int val;
    	BSTNode *left;
    	BSTNode *right;
    	BSTNode(int x): val(x), left(nullptr), right(nullptr){}
    };
    
  6. 并查集的实现(初始化+查+并)
    // 初始化
    const int MAX_SIZE = 100; // 假设并查集的最大元素个数
    int parent[MAX_SIZE]; // 用于存储每个元素的父节点
    void Initial(){
    	for(int i=0; i<MAX_SIZE; i++)
    		parent[i] = -1;
    }
    
    // 查
    int Find(int x){
    	while(parent[x]>=0)
    		x = parent[x];
    	return x;
    
    // 并
    void Union(int x, int y){
    	int RootX = Find(x);
    	int RootY = Find(y);
    	
    	if (RootX!=RootY)
    		parent[RootX] = RootY;
    }
    

二、代码/算法

  1. 二叉树的基础算法
    • 查找节点
    • 删除二叉树
    • 输出树高
    • 统计二叉树节点数目
    • 判断是否是平衡二叉树
  2. 二叉树的遍历
    • 先序遍历
    • 中序遍历
    • 后序遍历
    • 三种遍历的非递归转换(ACE中未提到)
    • Morris遍历算法(只有竟成提到了)
    • 层序遍历(ACE:层序遍历需要用到队列,408中要求写代码的可能性比较小,所以这里的重点是层序遍历的过程)
  3. 由遍历序列构造二叉树(只有ACE给出了用前序+中序构造二叉树的代码)
    • 前序+中序
    • 后序+中序
    • 层序+中序
  4. 线索二叉树(408考纲是“线索二叉树的基本概念与构造”,没有提及遍历,可酌情观看)
    • 通过中序遍历构造线索二叉树
    • 中序线索二叉树的遍历
    • 先序和后续线索二叉树的构造
    • 先序线索二叉树的遍历
    • 后续线索二叉树的遍历
  5. 并查集的初始化、查、并(代码写在上面的数据结构定义中)
  6. 二叉排序树
    • 查找
    • 构建与插入
    • 删除
  7. 平衡二叉树(代码难度较高,初试可以不用管,机试有小概率会考)

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

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

相关文章

Reinforcement Learning with Code 【Code 4. DQN】

Reinforcement Learning with Code 【Code 4. DQN】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement…

C++笔记之从数组指针到函数数组指针(使用using name和std::function)

C笔记之从数组指针到函数数组指针(使用using name和std::function) 参考笔记&#xff1a; C之指针探究(三)&#xff1a;指针数组和数组指针 C之指针探究(十三)&#xff1a;函数指针数组 C之指针探究(二)&#xff1a;一级指针和一维数组 C之指针探究(十一)&#xff1a;函数名的…

HCIP VLAN--Hybrid接口

一、VLAN的特点 1、一个VLAN就是一个广播域&#xff0c;所以在同一个VLAN内部&#xff0c;计算机可以直接进行二层通信&#xff1b;而不同VLAN内的计算机&#xff0c;无法直接进行二层通信&#xff0c;只能进行三层通信来传递信息&#xff0c;即广播报文被限制在一个VLAN内。 …

数字人现身大运会,怎么以动作捕捉技术助推运动与文博相结合

中国移动动感地带数字人橙络络&#xff0c;作为数智体验官以元宇宙的视角&#xff0c;带领观众沉浸式体验大运会&#xff0c;以极具科技和未来的数字人&#xff0c;对外传递大运青春风采&#xff0c;并且数字人橙络络还对大运会的赛事、活动进行了科普、讲解以及表演当地特色才…

Cpp学习——string(2)

目录 ​编辑 容器string中的一些函数 1.capacity() 2.reserve() 3.resize() 4.push_back()与append() 5.find系列函数 容器string中的一些函数 1.capacity() capacity是string当中表示容量大小的函数。但是string开空间时是如何开的呢&#xff1f;现在就来看一下。先写…

Postgresql15安装插件madlib2.0

madlib2.0简介 Apache MADlib madlib使用指南 MADlib: Main Page madlib安装 Installation Guide - Apache MADlib - Apache Software Foundation 准备 cmake 3.5.2及以上版本python3.9postgresql15&#xff0c;源码编译时必须指定 –with-pythonpostgresql插件plpython3u 源…

【Autolayout自动布局介绍2 Objective-C语言】

一、好,我们继续来介绍Autolayout 1.好,那么,我们接下来,开始上课了, 刚才,给大家介绍了一下,我们就是屏幕布局里面,用到的,主要就是这四个按钮: 1)第一个:是用来做对齐的 2)第二个:是用来做固定的 3)第三个:是用来解决自动布局中出现的一些问题的 4)第四…

元组是什么,python怎么使用元组

目录 引言 元组的概念 作用和优势 元组的应用 Python中如何使用元组 注意事项 总结 引言 在Python编程语言中&#xff0c;元组&#xff08;Tuple&#xff09;是一种不可变的数据结构&#xff0c;它允许我们以有序且不可修改的方式存储多个元素。与列表不同&#xff0c;…

简单游戏截图_可控截取内容2

一个需求 我需要在场景中截取不同层级的截图(如只截模型或只截UI或只截外部相加看到的画面 或全都截或和Shader配合呈现人眼夜视仪热成像的画面切换) 将截图排到列表中&#xff0c;在场景UI中展示出来 如何做 相机要能够看到不同的画面 将当前帧画面存储下来 将存储的画面展示出…

利用文档管理系统软件实现信息共享与知识沉淀

在当今信息的时代&#xff0c;各个企业和组织面临着大量的信息管理和知识沉淀的问题。为了更好地实现信息共享和知识沉淀&#xff0c;许多企业开始使用文档管理软件&#xff0c;该软件通过整合和管理各种文档&#xff0c;并提供强大的搜索和分享功能&#xff0c;有效促进了信息…

Java容器之Stack和Deque

Java容器之Stack和Deque 目录概述需求&#xff1a; 设计思路实现思路分析1.Java中Deque和Stack都是用于实现栈&#xff08;stack&#xff09;数据结构的类&#xff0c;但它们有一些区别。2.实现方式不同3.用途不同 拓展实现 参考资料和推荐阅读 Survive by day and develop by …

代驾小程序怎么做

代驾小程序是一款专门为用户提供代驾服务的手机应用程序。它具有以下功能&#xff1a; 1. 预约代驾&#xff1a;代驾小程序允许用户在需要代驾服务时提前进行预约。用户可以选择出发地点、目的地以及预计用车时间&#xff0c;系统会自动匹配最合适的代驾司机&#xff0c;并确保…

Ref从入门到入土

首先做个对比&#xff1a; 功能一&#xff1a;引用一个值做持久化记忆 场景&#xff1a;清除定时器 import { useRef } from "react" import { useState } from "react" // ref:1.引用一个值 做持久化记忆 // let num useRef(1) // console.log(num.cur…

Pandaer的iPhone手机壳

哇塞&#xff0c;Pandaer的设计太棒了&#xff01;手机壳的花样多到让我眼花缭乱&#xff0c;好多系列设计都很有意思&#xff0c;让人有集齐的冲动。我最近入手了几个iPhone的手机壳&#xff0c;它有亮色和透明的款式&#xff0c;亮色的壳内部也是亮的&#xff0c;因为手机壳全…

宝塔一键安装包安装魔众XX系统

1 环境安装 1.1 一定先看 在阅读本文档安装系统时&#xff0c;请确保您已经 熟练掌握 如何使用 apache 或 nginx 的进行网站系统的配置方法。 如果您 不是很了解 或 了解甚少&#xff0c;请直接购买我们的 付费安装服务&#xff0c;同时把服务器信息、需要安装的系统源码提供给…

8月1日上课内容 第一章web基础与http协议

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层--传输层---网络层----数据链路层-----物理层 ip地址&#xff0c;我们每一台主机都有一个唯一的地址标识(固定的ip地址)&#xff0c;区分用户和计算机通信。 ip地址:32位二进制数组成的&#xff0c;不方便记忆 192.168.…

Android Ble蓝牙App(三)特性和属性

Ble蓝牙App&#xff08;三&#xff09;特性使用 前言正文一、获取属性列表二、属性适配器三、获取特性名称四、特性适配器五、加载特性六、显示特性和属性七、源码 前言 在上一篇中我们完成了连接和发现服务两个动作&#xff0c;那么再发现服务之后要做什么呢&#xff1f;发现服…

Java循环:探索迭代的世界

文章目录 1. for循环2. while循环3. do-while循环总结 循环是编程中的重要概念&#xff0c;它允许我们重复执行特定的代码块&#xff0c;帮助我们简化复杂的任务和提高代码的效率。在Java中&#xff0c;循环有多种形式&#xff0c;包括for循环、while循环和do-while循环。本篇博…

玩转SWAT模型——最全面SWAT模型教程【建模方法、实例应用、高级进阶】

目录 第一部分&#xff1a;SWAT模型实践部分 第二部分&#xff1a;SWAT模型【进阶部分】 更多推荐 【专家】&#xff1a;刘老师【副教授】&#xff0c;北京重点高校资深专家&#xff0c;和美国SWAT软件开发方长期合作&#xff0c;拥有丰富的科研及工程技术经验&#xff0c;长…

虫情监测仪介绍—技术原理、功能优势是什么?

KH-CQPest虫情监测仪是做好虫情监测的重要设备&#xff0c;利用虫情监测仪能够对农业大田、智慧温室、林业等场景的害虫分布情况及害虫种类进行监测&#xff0c;协助人们制定合理的防治措施。 1.技术原理&#xff1a; KH-CQPest虫情监测仪采用光学诱虫原理&#xff0c;配合传感…