【数据结构】树与二叉树(十四):二叉树的基础操作:查找给定结点的父亲(算法Father )

文章目录

5.2.1 二叉树

  二叉树是一种常见的树状数据结构,它由结点的有限集合组成。一个二叉树要么是空集,被称为空二叉树,要么由一个根结点和两棵不相交的子树组成,分别称为左子树右子树。每个结点最多有两个子结点,分别称为左子结点和右子结点。
在这里插入图片描述

二叉树性质

引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i0

引理5.2:高度为k的二叉树中至多有 2 k + 1 − 1 2^{k+1}-1 2k+11个结点,其中 k ≥ 0 k \geq 0 k0

引理5.3:设T是由n个结点构成的二叉树,其中叶结点个数为 n 0 n_0 n0,度数为2的结点个数为 n 2 n_2 n2,则有 n 0 = n 2 + 1 n_0 = n_2 + 1 n0=n2+1

  • 详细证明过程见前文:【数据结构】树与二叉树(三):二叉树的定义、特点、性质及相关证明

满二叉树、完全二叉树定义、特点及相关证明

  • 详细证明过程见前文:【数据结构】树与二叉树(四):满二叉树、完全二叉树及其性质

5.2.2 二叉树顺序存储

  二叉树的顺序存储是指将二叉树中所有结点按层次顺序存放在一块地址连续的存储空间中,详见:
【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)

5.2.3 二叉树链接存储

  二叉树的链接存储系指二叉树诸结点被随机存放在内存空间中,结点之间的关系用指针说明。在链式存储中,每个二叉树结点都包含三个域:数据域(Data)、左指针域(Left)和右指针域(Right),用于存储结点的信息和指向子结点的指针,详见:
【数据结构】树与二叉树(六):二叉树的链式存储

5.2.4 二叉树的遍历

  • 遍历(Traversal)是对二叉树中所有节点按照一定顺序进行访问的过程。
  • 通过遍历,可以访问树中的每个节点,并按照特定的顺序对它们进行处理。
  • 对二叉树的一次完整遍历,可给出树中结点的一种线性排序。
    • 在二叉树中,常用的遍历方式有三种:先序遍历中序遍历后序遍历
    • 这三种遍历方式都可以递归地进行,它们的区别在于节点的访问顺序
      • 在实现遍历算法时,需要考虑递归终止条件和递归调用的顺序。
    • 还可以使用迭代的方式来实现遍历算法,使用栈或队列等数据结构来辅助实现。
  • 遍历是二叉树中基础而重要的操作,它为其他许多操作提供了基础,如搜索、插入、删除等。
    在这里插入图片描述

1-3 先序、中序、后序遍历递归实现及相关练习

【数据结构】树与二叉树(七):二叉树的遍历(先序、中序、后序及其C语言实现)

4. 中序遍历非递归

【数据结构】树与二叉树(八):二叉树的中序遍历(非递归算法NIO)

5. 后序遍历非递归

【数据结构】树与二叉树(九):二叉树的后序遍历(非递归算法NPO)

6. 先序遍历非递归

【数据结构】树与二叉树(十):二叉树的先序遍历(非递归算法NPO)

7. 层次遍历

【数据结构】树与二叉树(十一):二叉树的层次遍历(算法LevelOrder)

5.2.5 二叉树的创建

1. 先序创建

  由二叉树的遍历,很容易想到用遍历方法去创建二叉树,我们考虑从先根遍历思想出发来构造二叉树:

【数据结构】树与二叉树(十二):二叉树的递归创建(算法CBT)

2. 复制二叉树

  考虑用后根遍历思想递归复制二叉树的算法CopyTree:

【数据结构】树与二叉树(十三):递归复制二叉树(算法CopyTree)

5.2.6 二叉树的基础操作

1. 查找给定结点的父亲

  • 递归思想
    • 给定结点是指给定的是一个指向某个结点的指针(比如p)。
    • 返回值也应该是指针,指向结点p之父亲的指针(找不到时为空)。

a. 算法Father

在这里插入图片描述

b. 时间复杂度

  在递归实现的二叉树查找父亲的算法中,每个节点都要进行一次判断,最坏情况下,每个节点都需要被访问一次,所以时间复杂度是 O(n),其中 n 是二叉树的节点数。
  三叉链表是二叉树的一种存储结构,其中每个节点包含指向其左孩子、右孩子和父亲节点的指针。这种存储结构确实提供了在 O(1) 时间内访问父亲节点的能力。但请注意,这样的存储结构会占用更多的空间,因为每个节点需要额外的指针来存储父亲节点的地址。

  • 选择使用哪种存储结构通常取决于对时间和空间的权衡。
    • 如果空间要求比较敏感,并且不需要频繁访问父亲节点,那么递归实现可能是一个合理的选择。
    • 如果你需要高效地进行父亲节点的访问,并且可以接受更多的空间开销,那么三叉链表可能更适合。

c. 代码实现

struct Node* findFather(struct Node* root, struct Node* p) {
    if (root == NULL || p == NULL) {
        return NULL;
    }

    if (root == p) {
        return NULL;
    }

    if (root->left == p || root->right == p) {
        return root;
    }

    struct Node* leftResult = findFather(root->left, p);
    if (leftResult != NULL) {
        return leftResult;
    }

    return findFather(root->right, p);
}

  递归流程:

  • 如果树为空或者给定结点为空,则返回NULL
  • 如果给定结点是根节点,则根据定义返回NULL
  • 如果给定结点是根节点的左孩子或右孩子,则根节点就是其父亲
  • 在左子树中递归查找
    • 左子树为空,则返回NULL
    • 左子树的根节点必然不是给定结点,pass
    • 在左子树的左子树中递归查找
      • …………
    • 在右子树的右子树中递归查找
      • …………
  • 在右子树中递归查找
    • …………

2. 代码整合

#include <stdio.h>
#include <stdlib.h>

// 二叉树结点的定义
struct Node {
    char data;
    struct Node* left;
    struct Node* right;
};

// 创建新结点
struct Node* createNode(char data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    if (newNode == NULL) {
        printf("Memory allocation failed!\n");
        exit(1);
    }
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

struct Node* CBT(char data[], int* index, char tostop) {
    char ch = data[(*index)++];
    if (ch == tostop) {
        return NULL;
    } else {
        struct Node* t = createNode(ch);
        t->left = CBT(data, index, tostop);
        t->right = CBT(data, index, tostop);
        return t;
    }
}

// 查找给定结点的父亲节点(递归实现)
struct Node* findFather(struct Node* root, struct Node* p) {
    // 如果树为空或者给定结点为空,则返回NULL
    if (root == NULL || p == NULL) {
        return NULL;
    }

    // 如果给定结点是根节点,则根据定义返回NULL
    if (root == p) {
        return NULL;
    }

    // 如果给定结点是根节点的左孩子或右孩子,则根节点就是其父亲
    if (root->left == p || root->right == p) {
        return root;
    }

    // 在左子树中递归查找
    struct Node* leftResult = findFather(root->left, p);
    if (leftResult != NULL) {
        return leftResult;
    }

    // 在右子树中递归查找
    return findFather(root->right, p);
}

int main() {
    // 创建一棵二叉树
    char tostop = '#';
    char input_data[] = {'a', 'b', 'd', '#', '#', 'e', 'f', '#', '#', 'g', '#', '#', 'c', '#', '#'};
    int index = 0;

    struct Node* root = CBT(input_data, &index, tostop);

    // 需要找到父亲的结点,比如 'e'
    // struct Node* targetNode = root->left->right;
    struct Node* targetNode = root;

    // 调用函数查找父亲节点
    struct Node* fatherNode = findFather(root, targetNode);

    // 输出结果
    if (fatherNode != NULL) {
        printf("The father of '%c' is '%c'\n", targetNode->data, fatherNode->data);
    } else {
        printf("'%c' is either the root or not found in the tree.\n", targetNode->data);
    }


    return 0;
}

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于头脑风暴算法优化概率神经网络PNN的分类预测 - 附代码

基于头脑风暴算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于头脑风暴算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于头脑风暴优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

基于RK3399的室内健身魔镜方案

I 方案背景 一、健身魔镜的兴起 2020年疫情席卷全球&#xff0c;宅家是防疫的措施之一&#xff0c;因而宅家运动火爆&#xff0c;随之而来的宅家运动器材也风靡起来&#xff0c;其中包含既有颜值又具有多种功能的健身魔镜。 Ⅱ 方案介绍 一、健身魔镜的方案介绍 …

020线上线下融合商业模式 新零售系统定制开发

020线上线下融合商业模式将传统的线下实体店和线上电子商务相结合&#xff0c;通过双通道销售、互联网服务等方式&#xff0c;实现线上线下渠道的整合与协同发展。这种商业模式的核心在于通过整合线上线下资源&#xff0c;提供更优质的产品和服务&#xff0c;增强消费者体验和提…

查看包是由哪个依赖引入的

问题&#xff1a;在Maven项目中&#xff0c;如何查看某个包是由pom.xml文件的哪个依赖引入的&#xff1f; 示例&#xff1a; mvn dependency:tree -Dverbose -Dincludesjakarta.validation:jakarta.validation-api或者&#xff1a; mvn dependency:tree -Dincludesvelocity:…

微服务概览

单体架构 传统的软件应用为单体架构。尽管也是模块化逻辑&#xff0c;但是最终还是会打包并并部署为单体应用。最主要的原因是太复杂。并且应用扩展性低&#xff0c;可靠性也低。敏捷开发和部署变得无法完成。 治理办法&#xff1a;化繁为简&#xff0c;分而治之。 微服务起源…

基于回溯搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于回溯搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于回溯搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于回溯搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

【Python小程序】浮点矩阵加减法

一、内容简介 本文使用Python编写程序&#xff0c;实现2个m * n矩阵的加、减法。具体过程如下&#xff1a; 给定两个m*n矩阵A和B&#xff0c;返回A与B的和或差。 二、求解方法 将两个矩阵对应位置上的元素相加。 三、Python代码 import numpy as np# 用户输入两个矩阵的维…

Spring Bean 生命周期的执行流程

&#xff08;mic老师面试文档摘录&#xff09; 普通人的回答&#xff1a; Spring Bean 的生命周期&#xff0c;可以分为单例、多实例。呃... 不对&#xff0c;这个是 Spring Bean 的作用域。 生命周期&#xff0c;我想想.... 我记得 Bean 的生命周期会有加载、实例化、销毁…

开源供应链管理系统 多供应商批发管理系统方案及源码输出

开发框架&#xff1a;PHPMySQL 后端框架&#xff1a;ThinkPHP 订货端&#xff1a;PC小程序 客户订货端&#xff1a;小程序 多仓库OR多供应商&#xff1a;多供应商 是否进销存&#xff1a;自带进销存 整个方案含B端订货PC、小程序端、C端小程序端下单&#xff0c;源码&…

UI和UX设计师实用高效的设计工具大全

真正专业和优秀的UX设计师不会介意使用哪个工具。因为&#xff0c;只要能力足够&#xff0c;即使条件不同&#xff0c;工具不同&#xff0c;也可以设计出让人眼前一亮的作品。也许&#xff0c;这种理解本身并没有什么大问题。然而&#xff0c;如今&#xff0c;设计师显然有如此…

刨根问底:Java中的“\p{P}”到底是什么意思

问题由来&#xff1a; 在代码中看到了Pattern.compile("\\p{P}")&#xff0c;用来识别符号&#xff0c;但是这个正则表达式却不匹配加号&#xff0c;所以\p{P}到底是什么意思呢 谷歌了一下&#xff0c;找到StackOverflow上有人问了一模一样的问题 可是这个问题被关…

ChatGLM3本地部署运行(入门体验级)

文章目录 前言零 硬件小白基知填坑eForce Game Ready驱动程序CUDA常用命令 环境准备NVIDIA驱动更新CUDA安装 部署补充内容体验 前言 学习自B站up主技术爬爬虾&#xff0c;感谢up主提供的整合包&#xff01; 零 硬件 6GB以上显存的NVIDIA显卡&#xff08;品质越高&#xff0c…

基于猫群算法优化概率神经网络PNN的分类预测 - 附代码

基于猫群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于猫群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于猫群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

Redhat7查看时区、修改时区

问题&#xff1a; 安装好redhat7之后&#xff0c;发现时间和物理机上面的网络时间不一致&#xff0c;于是查看本着修改时间的目的&#xff0c;却发现原来是时区的问题。 解决步骤&#xff1a; 查看时区状态信息 timedatectl修改时区到亚洲/上海 timedatectl set-timezone A…

Lasso回归和岭回归详解

当数据特征存在多重共线性&#xff0c;特征矩阵不满秩&#xff0c;或者用普通线性回归过拟合的状况时&#xff0c;我们需要用lasso回归或岭回归来构建模型。 左边是lasso回归&#xff0c;右边是岭回归。 Lasso使用的是系数 的L1范式&#xff08;L1范式则是系数 的绝对值&#…

会展服务预约小程序的作用如何

不少场景都会有会展服务需求&#xff0c;比如婚宴、年会、展会等&#xff0c;往往需要租订场地&#xff0c;不同地域不同时间地点等&#xff0c;尤其大城市需求频次较高。 但在实际经营中&#xff0c;会员服务企业面临着一些难题。对多数企业来讲&#xff0c;线上是不可或缺的…

在 uniapp 中 一键转换单位 (px 转 rpx)

在 uniapp 中 一键转换单位 px 转 rpx Uni-app 官方转换位置利用【px2rpx】插件Ctrl S一键全部转换下载插件修改插件 Uni-app 官方转换位置 首先在App.vue中输入这个&#xff1a; uni.getSystemInfo({success(res) {console.log("屏幕宽度", res.screenWidth) //屏…

【Linux】你是否还在为安装虚拟机而烦恼?这篇博客将告诉你如何快速搭建Linux环境

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【2012年数据结构真题】

41题 &#xff08;1&#xff09; 最坏情况下比较的总次数 对于长度分别为 m&#xff0c;n 的两个有序表的合并过程&#xff0c;最坏情况下需要一直比较到两个表的表尾元素&#xff0c;比较次数为 mn-1 次。已知需要 5 次两两合并&#xff0c;故设总比较次数为 X-5, X 就是以 N…

5G网络切片,到底是什么?

网络切片&#xff0c;是5G引入的一个全新概念。 一看到切片&#xff0c;首先想到的&#xff0c;必然是把一个完整的东西切成薄片。于是&#xff0c;切面包或者切西瓜这样的画面&#xff0c;映入脑海。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 然而…
最新文章