二叉树实例学习(五)——更新节点及祖辈节点高度

2023-11-24 09:59

本文主要是介绍二叉树实例学习(五)——更新节点及祖辈节点高度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在第(四)节获取节点高度函数getHeight()函数的基础上,增添并测试更新节点高度函数和更新祖辈节点高度函数:updateHight()、updateAboveHei()。在上节中,每插入一个新节点,根结点以及新节点的其它祖辈节点的高度不增加,如今这已成为过去。在插入节点函数insertAsLC()、insertAsRC()函数中,分别添加updateAboveHei(),则每次插入新的节点,都会更新祖辈的节点高度。

节点类的代码,如第四节,不再增加。

树的定义代码如下:

#ifndef BINTREE
#define BINTREE
#include<binnode.h>template<typename T>
class BinTree
{
public:int _size;BinNodePosi(T) _root;//根结点指针int getHight(BinNodePosi(T) x){int l_hight,r_hight;if(x==NULL)return -1;else if(!hasChild(*x)){return 0;}else{l_hight = getHight(x->lc)+1;r_hight = getHight(x->rc)+1;}return l_hight>r_hight?l_hight:r_hight;}int max(int a,int b){if(a>b)return a;elsereturn b;}///更新节点高度函数updateHeight()/// 以及更新祖辈节点高度函数updateAboveHeight()virtual int updateHeight(BinNodePosi(T) x)//更新节点x的高度
    {return x->height=1+max(getHight(x->lc),getHight(x->rc));}void updateAboveHeight(BinNode<T> *x)//跟新节点x及其祖先的高度
    {while(x){updateHeight(x);//先更新当前节点高度x=x->parent;//然后更新祖辈节点高度
        }}public:BinTree():_size(0),_root(NULL){}int size()const{return _size;}//获取树的规模,即共有多少个节点bool empty(){return !_root;}//判断是否为空树BinNodePosi(T) root()const{return _root;}//获取根结点指针BinNodePosi(T) insertAsRoot(T const&e){_size=1;return _root=new BinNode<T>(e);}BinNodePosi(T) insertAsLC(BinNodePosi(T) x,T const&e){_size++;x->insertAsLC(e);
//        x->height =getHight(x);//将该语句替换为updateAboveHeight(x);
        updateAboveHeight(x);return x->lc;}BinNodePosi(T) insertAsRC(BinNodePosi(T) x,T const&e){_size++;x->insertAsRC(e);updateAboveHeight(x);return x->rc;}
};#endif // BINTREE

在测试程序中的树形结构如图所示

测试代码与第四节一样:

int main()
{BinNode<string>* n[6];//数组指针
BinTree<string> bt;n[0]= bt.insertAsRoot("n0");n[1]= bt.insertAsLC(n[0],"n1");n[2]= bt.insertAsRC(n[0],"n2");n[3]= bt.insertAsLC(n[1],"n3");n[4]=bt.insertAsLC(n[2],"n4");n[5]=bt.insertAsLC(n[4],"n5");//测试根结点的高度cout<<bt.getHight(n[2])<<endl;
//    bt.updateHeight(bt._root);cout<<bt._root->height<<endl;return 0;
}

我们可以看到,随着新节点的插入,根结点的高度随之而增加。

转载于:https://www.cnblogs.com/phoenixdsg/p/9771074.html

这篇关于二叉树实例学习(五)——更新节点及祖辈节点高度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/421715

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类