【数据结构】二叉树的建立与遍历

news2024/11/26 13:01:13

1.二叉树

1.1 二叉树的定义

        首先先来回顾一下什么是二叉树:

        二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

二叉树的五种可能的形态:

1.2 二叉树相关术语

  • 根节点(root node):位于二叉树顶层的节点,没有父节点。
  • 叶节点(leaf node):没有子节点的节点,其两个指针均指向None 。
  • 边(edge):连接两个节点的线段,即节点引用(指针)。
  • 节点所在的层(level):从顶至底递增,根节点所在层为 1 。
  • 节点的度(degree):节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。
  • 二叉树的高度(height):从根节点到最远叶节点所经过的边的数量。
  • 节点的深度(depth):从根节点到该节点所经过的边的数量。
  • 节点的高度(height):从距离该节点最远的叶节点到该节点所经过的边的数量。

1.3 二叉树的性质

性质1:二叉树的第 i 层上至多有2^{i-1} 个结点(i\geq 1)

性质2:深度为 k 二叉树至多有 2^{k}-1个结点(k\geq 1)

性质3:对任意一棵二叉树T,如果其叶子数为n_{0} ,度为2的结点数为n_{2}, 则 n_{0}=n_{2}+1

性质4:具有 n (n\geq 0) 个结点的完全二叉树的深度为 log_{2}(n+1) 或 log_{2}n+1

性质5:如果对一棵具有 n 个结点的完全二叉树的结点进行编号,则对任一结

i  (1\leq i\leq n ) 有:
        

        (1) 若 i=1 ,则该结点是二叉树的根,无双亲; 否则,其双亲结点的编号为 \frac{i}{2} \frac{i-1}{2} ;

        (2)如果 2i>n 则结点 i 没有左孩子, 否则,其左孩子的编号为 2i

        (3)如果 2i+1>n 则结点 i 没有右孩子,否则,其右孩子的编号为 2i+1

        (4)若 i 为奇数, i\neq 1,则其左兄弟为 i-1,

                 若 i 为偶数,  i\neq n, 则其右兄弟为i+1 

2.二叉树的遍历

从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

① 访问结点本身(N)

② 遍历该结点的左子树(L)

③ 遍历该结点的右子树(R)

在二叉树中,常见的遍历有先序遍历、中序遍历、后序遍历以及层序遍历,他们的主要思想分别是:

前序遍历:根结点 --> 左子树 --> 右子树

// 先序遍历
void PreOrderTraverse(BiTree T) {
    if (T == NULL) {
        return;
    }
    cout << T->data;
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}

 中序遍历:左子树 --> 根结点 --> 右子树

// 中序遍历
void InOrderTraverse(BiTree T) {
    if (T == NULL) {
        return;
    }
    InOrderTraverse(T->lchild);
    cout << T->data;
    InOrderTraverse(T->rchild);
}

后序遍历:左子树 --> 右子树 --> 根结点

// 后序遍历
void PostOrderTraverse(BiTree T) {
    if (T == NULL) {
        return;
    }
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    cout << T->data;
}

 层次遍历:自上而下,自左至右逐层访问树的结点

// 层序遍历
void LevelOrderTraverse(BiTree T) {
    BiTree queue[100]; // 队列
    int front = 0, rear = 0;
    if (T != NULL) { 
        rear = (rear + 1) % 100;  
        queue[rear] = T; 
    }
    while (front != rear) { 
        int levelSize = (rear - front + 100) % 100; // 当前层的结点个数
        for(int i = 0; i < levelSize; ++i){
            front = (front + 1) % 100;
            BiTree p = queue[front];
            cout << p->data;
            // 将当前结点的左右孩子入队 
            if (p->lchild != NULL) { 
                rear = (rear + 1) % 100;
                queue[rear] = p->lchild;
            }
            if (p->rchild != NULL) { 
                rear = (rear + 1) % 100;
                queue[rear] = p->rchild;
            }
        }
        cout << endl;
    }
}

层序遍历的算法思想

①初始化一个辅助队列

②根节点入队

③若队列非空,则队头结点出队,访问该结点,并将其左、右孩子插入队尾(如果有的话)

 

// 层序遍历
void LevelOrderTraverse(BiTree T) {
    BiTree queue[100]; // 队列
    int front = 0, rear = 0;
    if (T != NULL) { 
        rear = (rear + 1) % 100;  
        queue[rear] = T; 
    }
    while (front != rear) { 
        int levelSize = (rear - front + 100) % 100; // 当前层的结点个数
        for(int i = 0; i < levelSize; ++i){
            front = (front + 1) % 100;
            BiTree p = queue[front];
            cout << p->data;
            // 将当前结点的左右孩子入队 
            if (p->lchild != NULL) { 
                rear = (rear + 1) % 100;
                queue[rear] = p->lchild;
            }
            if (p->rchild != NULL) { 
                rear = (rear + 1) % 100;
                queue[rear] = p->rchild;
            }
        }
        cout << endl;
    }
}

 

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

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

相关文章

51单片机基础 06 串口通信与串口中断

目录 一、串口通信 二、串口协议 三、原理图 四、串口通信配置参数 1、常用的串行口工作方式1 2、数据发送 3、数据接收 4、波特率计算 5、轮询接收 6、中断接收 一、串口通信 串口通信是一种常见的数据传输方式&#xff0c;广泛用于计算机与外部设备或嵌入式系统之间…

智慧环保大数据解决方案

1. 智慧环保概述 智慧环保是“数字环保”的延伸&#xff0c;借助物联网技术整合环境监控对象&#xff0c;通过云计算实现环境管理与决策的智能化。其核心在于快速感知城市环境指标&#xff0c;保障人体健康与生命安全。 2. 智慧环保总体目标 智慧环保的总体目标是建立全面感…

如何使用identify_debugger去抓取信号

含有identify抓取信号的fpga版本做好了&#xff0c;那如何使用他去抓取信号呢&#xff1f; 1.terminal打开identify_debugger&#xff0c;直接这个命令identify_debugger&#xff0c;前提是你安装了synopsys的synaplify的软件&#xff0c;一般做芯片的都会有的哈。 2.打开界面后…

从 Llama 1 到 3.1:Llama 模型架构演进详解

编者按&#xff1a; 面对 Llama 模型家族的持续更新&#xff0c;您是否想要了解它们之间的关键区别和实际性能表现&#xff1f;本文将探讨 Llama 系列模型的架构演变&#xff0c;梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程&#xff0c;深入剖析了每个版本的技术创新&#…

windows基础

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

Jmeter中的配置原件

2&#xff09;配置原件 1--CSV Data Set Config 用途 参数化测试&#xff1a;从CSV文件中读取数据&#xff0c;为每个请求提供不同的参数值。数据驱动测试&#xff1a;使用外部数据文件来驱动测试&#xff0c;使测试更加灵活和可扩展。 配置步骤 准备CSV文件 创建一个CSV文…

c++基础知识复习(2)

1. 多态的虚函数的意义 1 案例&#xff1a;父类和子类有同名函数&#xff0c;但是功能不一样&#xff0c;但是同时&#xff0c;子类又继承了父类&#xff0c;就会导致调用的错误&#xff0c;想调用子类的同名函数&#xff0c; 但是在某些情况下&#xff0c;会错误调用父类的同…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台&#xff0c;具有简单轻量的部署方式与多样的功能&#xff0c;支持多种协议&#xff08;如GB28181、RTSP、Onvif、RTMP&#xff09;和设备类型&#xff08;IPC、NVR等&#xff09;&#xff0c;提供视频直播、录像、回放…

SpringBoot3+Jasypt如何在配置文件中对数据库的密码进行加密以防止密码泄露

在 Spring Boot 3 中&#xff0c;可以通过jasypt-spring-boot-starter对配置文件中的数据库密码或者其他重要密码进行加密&#xff0c;操作非常简单&#xff0c;可以有效防止密码泄露&#xff1a; 1. 使用 Jasypt 加密 添加依赖 在 pom.xml 中添加 Jasypt 依赖&#xff1a; …

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China&#xff0c;2018年4月established&#xff0c;独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1&#xff08;星辰处理器&#xff09; STAT-MC1&#xff0c;主要为满足AIOT应用性能、功…

Adobe Illustrator 2024 安装教程与下载分享

介绍一下 下载直接看文章末尾 Adobe Illustrator 是一款由Adobe Systems开发的矢量图形编辑软件。它广泛应用于创建和编辑矢量图形、插图、徽标、图标、排版和广告等领域。以下是Adobe Illustrator的一些主要特点和功能&#xff1a; 矢量绘图&#xff1a;Illustrator使用矢量…

CVE-2022-26201

打开是这么个页面 左上角找到Admin访问 里面有个Add Users&#xff0c;访问一下&#xff0c;能创建用户&#xff0c;有个能上传图片的地方 普通的一句话木马无法访问flag&#xff0c;需要创建一个权限马 <?php system($_GET[1]);phpinfo();?> 因为只能上传jpg形式的文…

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域&#xff0c;行人检测是一个重要的研究方向&#xff0c;它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先&#xff0c;我们需要安装 OpenCV 库。可以通过以下命令来安装&#…

【K8s】专题十五(4):Kubernetes 网络之 Calico 插件安装、切换网络模式、卸载

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

鸿蒙面试题-某迈-2024年11月22日

某迈-2024年11月22日 1. 自我介绍 2. 鸿蒙中地图功能如何实现&#xff0c;申请流程是什么样的 主要通过 集成 Map Kit 的功能来实现Map Kit 功能很强大&#xff0c;比如有 创建地图&#xff1a;呈现内容包括建筑、道路、水系等。地图交互&#xff1a;控制地图的交互手势和交…

微软要求 Windows Insider 用户试用备受争议的召回功能

拥有搭载 Qualcomm Snapdragon 处理器的 Copilot PC 的 Windows Insider 计划参与者现在可以试用 Recall&#xff0c;这是一项臭名昭著的快照拍摄 AI 功能&#xff0c;在今年早些时候推出时受到了很多批评。 Windows 营销高级总监 Melissa Grant 上周表示&#xff1a;“我们听…

【Android】静态广播接收不到问题分析思路

参考资料&#xff1a; Android 静态广播注册流程(广播2)-CSDN博客 Android广播发送流程(广播3)_android 发送广播-CSDN博客 https://zhuanlan.zhihu.com/p/347227068 在Android中&#xff0c;静态广播如果静态广播不能接收&#xff0c;我们可以从整个流程中去分析&#xff…

非递归遍历二叉树(数据结构)

我的博客主页 非递归遍历二叉树 前序遍历&#xff08;迭代&#xff09;中序遍历&#xff08;迭代&#xff09;后续遍历&#xff08;迭代&#xff09; 二叉树的遍历方式有&#xff1a;前序遍历、中序遍历、后续遍历&#xff0c;层序遍历&#xff0c;而树的大部分情况下都是通过递…

2024 java大厂面试复习总结(一)(持续更新)

10年java程序员&#xff0c;2024年正好35岁&#xff0c;2024年11月公司裁员&#xff0c;记录自己找工作时候复习的一些要点。 java基础 hashCode()与equals()的相关规定 如果两个对象相等&#xff0c;则hashcode一定也是相同的两个对象相等&#xff0c;对两个对象分别调用eq…

【可变参数,lambda,function,bind】

可变参数 Args模板参数包 解析参数包&#xff0c;使用递归和再来一个参数包。参数包传参时&#xff0c;会把第一个数据给前面的&#xff0c;剩下的数据全部传给后面的参数包&#xff0c;参数包就一直变小。 lambda表达式 书写格式&#xff1a;[capture-list] (parameters)…