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

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向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创