树 一

article/2025/8/19 6:28:33

文章目录

      • 1.查找
        • 二分查找判定树
      • 2. 树(Tree)
        • 2.1 树的术语
        • 2.2树的表示:儿子兄弟表示法
      • 3. 二叉树(Binary Tree)
        • 3.1 特殊结构二叉树
        • 3.2 二叉树的性质
        • 3.3 二叉树的存储
        • 3.4二叉树的遍历

分层次组织管理上更有效地操作。

1.查找

  • 静态查找:集合中记录固定,只有查找,没有插入和删除
  • 动态查找:集合中记录动态变化,除了查找,还可能发生插入和删除

二分查找判定树

如果把二分查找的顺序构造成二分查找判定树。

  • 根结点是第一次比较的值,根结点的子节点分别是大于/小于时第二个进行比较的值。
  • 判定树上每个节点需要查找的次数是该节点所在的层数
  • 查找成功时,查找次数不会超过判定树的深度
  • n个节点的判定树深度为 log ⁡ 2 n + 1 \log_2 n + 1 log2n+1
  • ASL(平均查找次数) = ∑ 层数 ∗ 该深度层的结点数 / 总结点数 \sum\text{层数}*\text{该深度层的结点数} / \text{总结点数} 层数该深度层的结点数/总结点数
  • 以树的形式存储数据,方便查找
    • 在树中插入或删除节点时方便,解决动态查找的问题

2. 树(Tree)

  • n个节点构成的有限集合,n=0时是空树
  • 有一个根结点
  • 其余节点分为m个不相交的集合,每个集合又是一棵树,称为原来的“子树”
  • 除根结点,每个结点只有一个父节点
  • 一颗N个节点的树,有N-1条边

2.1 树的术语

  • 节点的度(degree):结点的子树个数
  • 树的度:树中所有节点中最大的度数
  • 叶节点(leaf):度为0的节点
  • 父节点(parent):有子树的节点是其子树的根结点的父节点
  • 子节点(child)
  • 兄弟节点(sibling)
  • 路径和路径的长度:路径包含边的个数是路径的长度
  • 祖先节点:沿树根到某一节点路径上的所有节点都是这个节点的祖先节点
  • 子孙节点:某节点的子树中全部节点
  • 节点的层次:根结点层数为1,其它层的层数是父节点层数+1
  • 树的深度:树中最大层次

2.2树的表示:儿子兄弟表示法

class Node:def __init__(self,data):self.data = dataself.firstchild = Noneself.nextSibling = None

如下图所示,每个节点由数值、第一个子节点、第一个兄弟节点构成。

3. 二叉树(Binary Tree)

  • 度为2的树(子节点最多有两个)
  • 由根结点、左子树、右子树构成
  • 二叉树的子树有左右顺序之分
  • 节点存储的值未必有顺序之分

3.1 特殊结构二叉树

  • 斜二叉树(skewed Binary Tree):只有左子节点或只有右子节点
  • 完美二叉树(Perfect Binary Tree)/满二叉树(Full Binary Tree):除叶节点的所有的节点都有左子节点、右子节点;叶节点都在同一层
  • 完全二叉树(complete Binary Tree):除叶节点的所有的节点都有左子节点、右子节点;要求与完美二叉树从左到右从上到下对节点编号时,同编号的位置一致。允许最下层右边的叶节点有缺失。

3.2 二叉树的性质

  • 第i层最大节点数 2 i − 1 2^{i-1} 2i1
  • 深度为h的二叉树,节点数最多有 2 h − 1 2^h-1 2h1
  • 对任何非空二叉树
    • n 0 n_0 n0表示叶节点的个数
    • n 1 n_1 n1是度为1(只有一个儿子)的非叶节点个数
    • n 2 n_2 n2是度为2(有两个儿子)的非叶节点个数
    • 满足关系 n 0 = n 2 + 1 n_0 = n_2 + 1 n0=n2+1(由于整颗树的边满足 n 0 + n 1 + n 2 − 1 = n 1 + n 2 ∗ 2 n_0 + n_1 + n_2 -1 = n_1 + n_2*2 n0+n1+n21=n1+n22)

3.3 二叉树的存储

  1. 列表表示
    将树对应为完全二叉树(用None填充空值),按照从上至下、从左到右顺序存储。
  • 非根节点的父节点序号是 i / / 2 i//2 i//2
  • 节点的左儿子是 2 i 2i 2i,右儿子是 2 i + 1 2i+1 2i+1
  1. 链表存储,表示为
class Node:def __init__(self,data):self.data = dataself.left = Noneself.right = None

3.4二叉树的遍历

  1. 深度优先
  • 先序遍历(中左右)
    访问根结点 -> 先序遍历左子树 -> 先序遍历右子树
    按先序遍历访问上面二叉树的顺序为[1,2,4,5,3,6,7]
def preOrder(root):if root is not None://中print(root.data)//左preOder(root.left)//右preOder(root.right)

用非递归的方式实现

def InOrderStep(root):#空栈stack = list()current = rootdone = Falsewhile !done:if current != None:stack.append(current)current = current.leftelse:if len(stack)> 0:current = stack.pop()print(current.data)current = current.rightelse:done = True
  • 中序遍历
    中序遍历左子树 -> 访问根结点 -> 中序遍历右子树
    按中序遍历访问上面二叉树的顺序为[4,2,5,1,6,3,7]
def inOrder(root):if root is not None://左inOrder(root.left)//中print(root.data)//右inOrder(root.right)
  • 后序遍历
    后序遍历左子树 ->后序遍历右子树 -> 根结点
    按后序遍历访问上面二叉树的顺序为[4,5,2,6,7,3,1]
def postOrder(root):if root is not None://左postOrder(root.left)//右postOrder(root.right)//中print(root.data)
  1. 层次遍历(宽度优先)
from collections import deque
def levelOrder(root):queue = deque()queue.append(root)while len(queue) != 0:temp_node = queue.popleft()print(temp_node.data)if temp_node.left is not None:queue.append(temp_node.left)if temp_node.right is not None:queue.append(temp_node.right)

http://chatgpt.dhexx.cn/article/ExnC0PAJ.shtml

相关文章

树一:邂逅入门篇

一、树的概念 树是一种典型的非线性结构,是表达有层次特性的图结构的一种方法。 1.1 基本术语 术语描述空树当n0 时称为空树。根结点根结点是一个没有双亲结点的结点。一棵树最多一个。例如:A边结点之间的连线叶子结点没有孩子结点的结点。例如&#x…

树一:定义及存储

树的定义: 树是一种非线性的数据结构。树是由 n (n > 0) 个结点组成的有序集合。 如果 n 为0,称为空树;如果 n > 0, 则: 有一个结点称为根结点(root),它有直接后继,但没有直接…

mysql 创建索引规则

1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 5、…

mysql分区表之三:MySQL分区建索引,唯一索引

介绍 mysql分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表,从“information_schema.INNODB_SYS_TABLES”系统表可以看到每个分区都存在独立的TABLE_ID,由于Innodb数据和索引都是保存在".ibd"文件当中&#…

分享mysql创建索引的3种方法

大家应该都知道索引的建立对于MySQL数据库的高效运行是很重要的,索引可以大大提升MySQL的检索速度,下面这篇文章主要给大家介绍了关于mysql创建索引的3种方法,需要的朋友可以参考下 1、使用CREATE INDEX创建,语法如下: 1 CREATE INDEX indexName ON tab…

js 监听浏览器刷新还是关闭事件

// $(window).bind(beforeunload,function(){return 您输入的内容尚未保存,确定离开此页面吗?;}); // window.onbeforeunload function() { return "确定离开此页面吗?"; }; // function myFunction() {return "自定…

浏览器刷新和页面手动为什么不一样?

Fiddler(2):AutoResponse修改返回结果_mb5fed6ec4336ce的技术博客_51CTO博客Fiddler(2):AutoResponse修改返回结果,前言怎么修改接口的返回数据呢步骤1.抓包,找到要拦截的请求,然后在AutoResponder中AddRule:2.在RuleEditor中的第…

vue监听浏览器刷新和关闭事件,并在页面关闭/刷新前发送请求

vue监听浏览器刷新和关闭事件,并在页面关闭/刷新前发送请求 1.需求背景:2.需求分析:3.实现方式:4.实现方式解析:1)浏览器页面事件基础2)在mounted监听beforeunload和unload事件 5.存在的问题/风…

浏览器刷新和关闭时显示提示信息

vue 刷新和关闭浏览器时显示提示信息 使用onbeforeunload事件 mounted() {window.onbeforeunload e > {e e || window.eventif (e) {e.returnValue 关闭提示}return 关闭提示}} }, beforeDestroy() {window.onbeforeunload null },如果是所有页面都需要页面销毁显示提…

【Vue实用功能】Vue监听浏览器刷新和关闭事件

Vue监听浏览器刷新和关闭事件 在前端开发中,我们通常会遇到这样的需求,用户离开、刷新页面前,修改数据未进行保存操作,需要提示框提醒用户 效果实现 methods: {/** 在刷新和关闭之前询问 **/beforeRefreshClose() {let self t…

vue监听浏览器刷新和关闭;

注意&#xff1a;区分不了浏览器是触发了刷新还是关闭&#xff0c;而且提示的弹框是无法自定义的&#xff1b;如果有大佬有方法能区分&#xff0c;还请评论学习一下&#xff01;感谢&#xff01; 代码可直接复制&#xff1a; <template><div><div /></di…

JS阻止浏览器刷新的方法

直接先给朋友们上阻止浏览器刷新的代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&quo…

VSCODE同步浏览器刷新

VSCODE同步浏览器刷新 安装插件 live server

java中foreach的用法

文章目录 前言语法用法用法1&#xff1a;输出一维数组用法2&#xff1a;输出二维数组foreach的局限性什么是索引 总结 前言 java中foreach,可以认为是增强版的for语句循环&#xff0c;它可以减少代码量&#xff0c;但是不是所有的foreach都可以代替for循环。 语法 foreach的…

JAVA实现九九乘法表

用java语言实现九九乘法表&#xff0c;这里使用的是for循环 public class NineNineDemo{public static void main(String[] args){int i1;//对行变量赋值int j1;//对列变量赋值for(i1;i<9;i){for(j1;j<i;j){//行变量外循环&#xff1b;列变量内循环System.out.print(i&q…

Java的ASCII编码表

数字和字符的对照关系表&#xff08;编码表&#xff09;&#xff1a; ASCII码表&#xff1a;American Standard Code for Information Interchange, 美国信息交换标准代码。 Unicode码表&#xff1a;万国码。也是数字和符号的对照关系&#xff0c;开头0-127部分和ASCII完全一样…

JAVA——链表

一、链表概念及结构 链表&#xff1a;链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的。如下图&#xff1a;&#xff08;通俗的说&#xff1a;就是由一个个节点组成&#xff0c;这些节点逻辑上连续&#xff0c;物理上…

java对象复制_Java对象的复制三种方式

Java对象的复制三种方式 概述 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。…

Java 如何复制 List ?

List 复制在项目开发时&#xff0c;使用到的频率还是比较高的。List 复制有浅拷贝和深拷贝两种方式。在陈述复制方法前&#xff0c;先总结下什么是浅拷贝和深拷贝(以下内容均站在 Java 语言基础上进行讨论)。 一、什么是浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&a…

Java对象复制

文章目录 前言何不可变类对象复制方式1.直接赋值2.浅拷贝3.深拷贝 对象复制方案1.get/set2.Spring BeanUtils3.Apache BeanUtils4.BeanCopier5.Orika6.Dozer7.MapStruct8.Bean Mapping9.Bean Mapping ASM10.ModelMapper11.JMapper12.Json2Json 复制方案选择 前言 在我们实际项…