首页 > 编程语言 >如何学习算法:什么时完全二叉树?完全二叉树有什么特点?

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?

时间:2024-01-26 22:31:58浏览次数:41  
标签:arr 示例 元素 完全 算法 二叉树 数组 节点

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树

完全二叉树

我们知道树是一种非线性数据结构。它对儿童数量没有限制。二叉树有一个限制,因为树的任何节点最多有两个子节点:左子节点和右子节点。

什么是完全二叉树?

完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点从尽可能左侧填充之外。

完全二叉树的一些术语:

  • 根: 没有边来自父节点的节点。示例-节点A
  • 子节点: 具有某些传入边的节点称为子节点。示例 – 节点 B、F 分别是 A 和 C 的子节点。
  • 兄弟节点:具有相同父节点的节点是兄弟节点。示例 - D、E 是兄弟姐妹,因为他们有相同的父母 B。
  • 节点的度数: 特定父节点的子节点数量。示例 - A 的次数为 2,C 的次数为 1。D 的次数为 0。
  • 内部/外部节点: 叶节点是外部节点,非叶节点是内部节点。
  • 级别: 计算到达目标节点的路径中的节点数。示例 - 由于节点 A 和 E 形成路径,因此节点 D 的级别为 2。
  • 高度: 到达目标节点的边数,根的高度为 0。示例 – 节点 E 的高度为 2,因为它有两条距根的边。

我们知道是一种非线性数据结构。它对叶子节点数量没有限制。二叉树有一个限制,因为树的任何节点最多有两个子节点:左子节点和右子节点.

什么是完全二叉树?

完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点尽可能左侧填充之外。

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树_02

完全二叉树的一些术语:

  • :没有边来自父节点的节点。示例-节点A
  • 子节点: 具有某些传入边的节点称为子节点。示例 – 节点 B、F 分别是 A 和 C 的子节点。
  • 兄弟节点:具有相同父节点的节点是兄弟节点。示例 - D、E 是兄弟姐妹,因为他们有相同的父母 B。
  • 节点的度数: 特定父节点的子节点数量。示例 - A 的次数为 2,C 的次数为 1。D 的次数为 0。
  • 内部/外部节点: 叶节点是外部节点,非叶节点是内部节点。
  • 级别: 计算到达目标节点的路径中的节点数。示例 - 由于节点 A 和 E 形成路径,因此节点 D 的级别为 2。
  • 高度:到达目标节点的边数,根的高度为 0。示例 – 节点 E 的高度为 2,因为它有两条距根的边。

完全二叉树的性质:

  • 完全二叉树被称为真二叉树,其中所有叶子都具有相同的深度。
  • 在完全二叉树中,深度d处的节点数为 2 d
  • 在具有n 个节点的完全二叉树中,树的高度为log(n+1)
  • 除最后一个级别外所有级别均已满。

完美二叉树与完全二叉树:

具有最大节点数、高度为“h”的二叉树是完美二叉树。 对于给定高度h,节点的最大数量为 2h+1-1

高度为 h 的完全二叉树是高度为h-1的完美二叉树,并且在最后一层中元素按从左到右的顺序存储。

示例1:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_子节点_03

给定二叉树的高度为 2,该树中的最大节点数为 n = 2 h+1 -1 = 22+1 -1 = 23 -1 = 7。 因此我们可以断定它是一个完美的二叉树。 现在对于一个完整的二叉树,它的高度达到h-1,即;1、最后一层元素按照从左到右的顺序存储。因此它也是一棵完全二叉树。这是存储在数组中时元素的表示形式

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_子节点_04

元素逐级存储在数组中。在数组中,所有元素都是连续存储的。

示例2:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树_05

给定二叉树的高度为 2,节点的最大数量为 2h+1 – 1 = 22+1 – 1 = 2 3 – 1 = 7。 但树中的节点数是6。因此它不是完美的二叉树。 现在对于一个完整的二叉树,它的高度达到 h-1,即;1 和最后一级元素按从左到右的顺序存储。因此这是一个完全二叉树。将元素存储在数组中,它会像;

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_完全二叉树_06

示例3:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_子节点_07

二叉树的高度为2,最多可以有7个节点,但只有5个节点,因此它不是完美的二叉树。 在完全二叉树的情况下,我们看到在最后一层元素不是从左到右顺序填充的。所以它不是一个完全二叉树

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树_08

数组中的元素不连续。

完整二叉树与完全二叉树:

对于满二叉树,每个节点有 2 个子节点或 0 个子节点。

示例1:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树_09

在给定的二叉树中,没有度数为 1 的节点,每个节点有 2 个或 0 个子节点,因此它是一个满二叉树

对于完全二叉树,元素是逐层存储的,而不是从最后一层的最左边开始。因此这不是一个完整的二叉树。数组表示形式为:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_完全二叉树_10

示例2:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树_11

在给定的二叉树中,没有度为 1 的节点。每个节点的度为 2 或 0。因此,它是满二叉树

对于完全二叉树,元素是逐层存储的,并从最后一层的最左边开始填充。因此这是一个完全二叉树。下面是树的数组表示:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_完全二叉树_12

示例3:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树_13

在给定的二叉树中,节点 B 的度数为 1,这违反了满二叉树的属性,因此它不是满二叉树

对于完全二叉树,元素是逐层存储的,并从最后一层的最左边开始填充。因此这是一个完全二叉树。二叉树的数组表示为:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_完全二叉树_14

示例4:

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_完全二叉树_15

在给定的二叉树中,节点 C 的度数为 1,这违反了满二叉树的属性,因此它不是满二叉树

对于完全二叉树,元素是逐层存储的,并从最后一层的最左边开始填充。这里节点 E 违反了条件。因此这不是一个完整的二叉树

完全二叉树的创建:

我们知道,完全二叉树是一棵树,其中除了最后一层(例如l)之外,所有其他层都有(2l)个节点,并且节点从左到右排列。 可以使用数组来表示。如果父级是索引i则左子级位于2i+1,右子级位于2i+2

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树_16

算法:

为了创建完全二叉树,我们需要一个队列数据结构来跟踪插入的节点。

步骤1:当树为空时,用新节点初始化根。

步骤2:如果树不为空,则获取前面的元素

  • 如果前面的元素没有左子节点,则将左子节点设置为新节点
  • 如果右子节点不存在,则将右子节点设置为新节点

步骤 3:如果该节点有两个子节点,则将其从队列中弹出

步骤4:将新数据入队。

考虑下面的数组:

  1. 第一个元素将是根(索引处的值 = 0

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_子节点_17

A 被视为根

  1. 下一个元素(索引 = 1处)将是左元素,第三个元素(索引 = 2)将是根的右子元素

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树_18

B 作为A左孩子,D 作为A右孩子

  1. 第四个(索引 = 3)和第五个元素(索引 = 4)将是 B 节点的左右子节点

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_二叉树_19

EFB的左孩子和右孩子

  1. 下一个元素(索引= 5)将是节点D的左子节点

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?_完全二叉树_20

G 成为 D 节点的左子节点

这就是完整二叉树的创建方式。

完全二叉树的应用:

  • 堆排序
  • 基于堆排序的数据结构

顺序方式从给定数组构造完整二叉树

给定一个元素数组,我们的任务是以顺序方式从该数组构造一个完整的二叉树。也就是说,数组左侧的元素将从第 0 层开始逐层填充到树中。

示例:

输入:arr[] = {1, 2, 3, 4, 5, 6}
 输出:以下树的根
                   1
                  / \
                 2   3
                / \ /
               4  5 6
 
 
 输入:arr[] = {1, 2, 3, 4, 5, 6, 6, 6, 6, 6}
 输出:以下树的根
                    1
                   / \
                  2   3
                 / \ / \
                4  5 6 6
               / \/
              6  66

我们仔细观察,我们可以看到,如果父节点位于数组中的索引 i 处,则该节点的左子节点位于索引 (2i + 1) 处,右子节点位于索引处 (2i + 2)在数组中。 利用这个概念,我们可以通过选择父节点来轻松插入左节点和右节点。我们将插入数组中存在的第一个元素作为树中第 0 层的根节点,并开始遍历数组,对于每个节点,我们将在树的左侧和右侧插入子节点。

下面是执行此操作的递归程序:

JavaScript 代码


 let root
 
 class Node {
     constructor(data) {
         this.left = null
         this.right = null
         this.data = data
     }
 }
 
 // 将 arr 数组中的元素构造为二叉树
 function insertLevelOrder(arr, i) {
     let root = null
     if (i < arr.length) {
       root = new Node(arr[i]);
       // 设置节点的左节点
       root.left = insertLevelOrder(arr, 2 * i + 1);
       // 设置节点的右节点
       root.right = insertLevelOrder(arr, 2 * i + 2);
     }
     return root
 }
 
 // 按树结构打印元素
 function inOrder(root) {
     if (root != null) {
         console.log("元素的值:" + root.data);
         inOrder(root.left)
         inOrder(root.right)
     }
 }
 
 let arr = [1, 2, 3, 4, 5, 6, 6, 6, 6];
 // 将数组转换为树结构
 root = insertLevelOrder(arr, 0);
 // 打印树结构的元素
 inOrder(root);

输出结果:[1 2 4 6 6 5 3 6 6]

Golang 代码

package main
 
 import (
   "fmt"
   "testing"
 )
 
 type Node struct {
   Left  *Node
   Right *Node
   Data  int
 }
 
 // 给定数据构建二叉树
 func insertLevelOrder(arr []int, index int) *Node {
   var node *Node
   if index < len(arr) {
     node = &Node{
       Left:  insertLevelOrder(arr, 2*index+1),
       Right: insertLevelOrder(arr, 2*index+2),
       Data:  arr[index],
     }
   }
   return node
 }
 
 func inOrder(node *Node) []int {
   var rest []int
   if node != nil {
     rest = append(rest, node.Data)
     rest = append(rest, inOrder(node.Left)...)
     rest = append(rest, inOrder(node.Right)...)
   }
   return rest
 }
 
 func Test_main(t *testing.T) {
   var arr = []int{1, 2, 3, 4, 5, 6, 6, 6, 6}
   node := insertLevelOrder(arr, 0)
   result := inOrder(node)
   fmt.Println(result)
 }

输出结果: [1 2 4 6 6 5 3 6 6]


标签:arr,示例,元素,完全,算法,二叉树,数组,节点
From: https://blog.51cto.com/demo007x/9438834

相关文章

  • nodejs雪花ID算法(SnowflakeID)
    前言项目中常使用的三种id类型,分别是自增id、uuid、雪花id,这三种各有优劣。本篇主要实现nodejs中snowflake算法的代码。一、Snowflake实现这里需要加入big-integer的模块,下载npminstall--save big-integervarSnowflake=(function(){functionSnowflake(_......
  • 算法题总结
    1、接雨水Leetcode给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示......
  • 代码随想录算法训练营第三天| 203.移除链表元素,707.设计链表 ,206.反转链表
    203.移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。题目链接:203.移除链表元素-力扣(LeetCode)注意c++中NULL和nullptr的区别。应该用nullptr来表示空指针。/***Definitionforsingly......
  • LntonAIServer视频汇聚算法分析平台区域行人入侵算法检测
    在这个信息化飞速发展的时代,安全已成为我们不可忽视的话题。随着科技的进步,传统的物理防护手段已无法满足日益增长的安全需求。在这样的背景下,LntonAIServer视频汇聚算法分析平台应运而生,它如同一双智慧之眼,守护着我们的安全边界。LntonAIServer平台的核心技术之一便......
  • A*算法
    A*算法是求解一个点到另一个点的最短路径,是针对点到点的最短路径算法。A*算法增加了一个当前点到目标点的预估函数在堆中根据源点到当前点+当前点到目标点的预估距离来排序剩下的细节和Dijskra算法完全已一样,只有在放入堆中的元素不一样预估函数要求:当前点到目标点的预估......
  • 京东广告算法架构体系建设--在线模型系统分布式异构计算演变 | 京东零售广告技术团队
    一、现状介绍 算法策略在广告行业中起着重要的作用,它可以帮助广告主和广告平台更好地理解用户行为和兴趣,从而优化广告投放策略,提高广告点击率和转化率。模型系统作为承载算法策略的载体,目前承载搜索、推荐、首焦、站外等众多广告业务和全链路的深度学习建模,是广告算法算法创新......
  • 搜索推荐DeepFM算法详解:算法原理、代码实现、比赛实战
    搜索推荐DeepFM算法详解:算法原理、代码实现、比赛实战可以说,DeepFM是目前最受欢迎的CTR预估模型之一,不仅是在交流群中被大家提及最多的,同时也是在面试中最多被提及的:1、Deepfm的原理,DeepFM是一个模型还是代表了一类模型,DeepFM对FM做了什么样的改进,FM的公式如何化简并求......
  • 读论文-基于自监督学习的序列推荐算法
    前言今天读的文章为一篇名叫《基于自监督学习的序列推荐算法》的期刊论文,文章于2023年8月15日发表在自然科学报上,这篇论文的引用为:[1]闫猛猛,汪海涛,贺建峰等.基于自监督学习的序列推荐算法[J].重庆邮电大学学报(自然科学版),2023,35(04):722-731.摘要原文如下:针对现有序列......
  • 安防视频汇聚平台智能边缘分析一体机视频算法分析识别打电话检测算法
    在智能视频监控的广阔舞台上,打电话检测算法如同一位细心的守护者,它基于图像处理和机器学习的先进技术,致力于识别和分析视频中的人物行为。这项技术不仅仅是一个简单的监控工具,它更是一种智能的分析手段,能够在复杂的场景中准确地判断个体是否在进行电话通话。首先,算法的工作流程是一......
  • 安防视频汇聚平台智能边缘分析一体机视频算法分析识别打电话检测算法
    在智能视频监控的广阔舞台上,打电话检测算法如同一位细心的守护者,它基于图像处理和机器学习的先进技术,致力于识别和分析视频中的人物行为。这项技术不仅仅是一个简单的监控工具,它更是一种智能的分析手段,能够在复杂的场景中准确地判断个体是否在进行电话通话。首先,算法......