树T中所有节点深度的最大值称为该树的高度(height),实际上每个节点与其所有子节点都可以看做一颗树,也就是说除了根结点,所有子结点都可以看做是一颗子树,因此每个结点都有树高。在本程序中约定,仅含单个结点的树高为0,空树高度为-1。据此,编写getHight():

    int getHight(BinNodePosi(T) x)
{
int l_hight,r_hight;
if(x==NULL)
return -;
else if(!hasChild(*x))
{
return ;
}
else
{
l_hight = getHight(x->lc)+;
r_hight = getHight(x->rc)+;
}
return l_hight>r_hight?l_hight:r_hight;
}

结点类定义代码如下:

#ifndef BINNODE
#define BINNODE
#include <iostream>
//***************************************************************************************
///代码5.2 , BinNode状态与性质的判断
///一、 判断该节点是什么!
/// 是否是根节点、是否是左子节点、是否是右子节点、是否是叶节点
#define isRoot(x) (!((x).parent))
#define isLChild(x) (!isRoot(x)&&(&(x)==(x).parent->lc)) //不是根节点,同时必须是父节点的左孩子
#define isRChild(x) (!isRoot(x)&&(&(x)==(x).parent->rc)) //不是根节点,同时必须是父节点的右孩子
///二、判断该节点有什么
//判断是否有孩子
#define hasLChild(x) ((x).lc!=NULL) //判断节点x是否有左孩子
#define hasRChild(x) ( (x).rc ) //判断节点x 是否有右孩子
#define hasChild(x) ( hasLChild(x)||hasRChild(x)) //判断节点x是否有孩子(左、右至少有一个)
//判断是否为叶节点
#define isLeaf(x) ( !hasChild(x) ) //判断节点x是否是叶子节点 //****************************************************************************************
#define BinNodePosi(T) BinNode<T>* //节点位置 typedef enum{RB_RED,RB_BLACK} RBColor;//节点颜色 template <typename T>
class BinNode
{
public:
T data;//数值
int height;
int npl;//Null Path Length(左式堆,也可直接用height代替)
RBColor color;
BinNodePosi(T) parent;//父节点
BinNodePosi(T) lc;//左子节点
BinNodePosi(T) rc;//右子节点
//构造函数
BinNode():parent(NULL),lc(NULL),rc(NULL),height(),npl(),color(RB_RED){}
BinNode(T e,BinNodePosi(T) p=NULL,BinNodePosi(T) lc=NULL,BinNodePosi(T) rc=NULL,
int h=,int l=,RBColor c=RB_RED)
{
data=e;
parent=p;
this->lc=lc,this->rc=rc;//此处添加this指针,以便将成员变量lc、rc与形参lc和rc区分 height=h;
npl=l;
color=c;
}
///***********插入孩子节点*******************************
/// 将数据e作为当前节点的左孩子或右孩子插入,并返回该节点指针
BinNodePosi(T) insertAsLC(T const&e)
{
return lc=new BinNode(e,this);
}
BinNodePosi(T) insertAsRC(T const&e)
{
return rc=new BinNode(e,this);
}
};
#endif // BINNODE

树的定义代码如下:

#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 -;
else if(!hasChild(*x))
{
return ;
}
else
{
l_hight = getHight(x->lc)+;
r_hight = getHight(x->rc)+;
}
return l_hight>r_hight?l_hight:r_hight;
} virtual int updateHeight(BinNodePosi(T) x)//更新节点x的高度
{ } // void updateAboveHeight(BinNode<T> *x);//跟新节点x及其祖先的高度
public:
BinTree():_size(),_root(NULL){}
int size()const{return _size;}//获取树的规模,即共有多少个节点
bool empty(){return !_root;}//判断是否为空树
BinNodePosi(T) root()const{return _root;}//获取根结点指针
BinNodePosi(T) insertAsRoot(T const&e)
{
_size=;
return _root=new BinNode<T>(e);
} BinNodePosi(T) insertAsLC(BinNodePosi(T) x,T const&e)
{
_size++;x->insertAsLC(e);
x->height =getHight(x);
return x->lc;
}
BinNodePosi(T) insertAsRC(BinNodePosi(T) x,T const&e)
{
_size++;x->insertAsRC(e);
x->height=getHight(x);
return x->rc;
}
}; #endif // BINTREE

在测试程序中设计了六个结点的二叉树:

测试程序代码如下:

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

运行结果如下:

由于每次插入新结点,都没有对插入结点的父辈结点更新高度,所以bt树的根结点的高度始终为1.

二叉树实例学习(四)——获取节点的高度函数getHight()的更多相关文章

  1. 父级(display:none)隐藏时,子节点的高度获取。

    当父节点display:none的时候,子节点的高度是0获取不到. 解决办法:用visibility替换display就可以了.

  2. 二叉树系列 - 求两节点的最低公共祖先,例 剑指Offer 50

    前言 本篇是对二叉树系列中求最低公共祖先类题目的讨论. 题目 对于给定二叉树,输入两个树节点,求它们的最低公共祖先. 思考:这其实并不单单是一道题目,解题的过程中,要先弄清楚这棵二叉树有没有一些特殊的 ...

  3. day 83 Vue学习四之过滤器、钩子函数、路由、全家桶等

    Vue学习四之过滤器.钩子函数.路由.全家桶等   本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤 ...

  4. 动态获取div的高度 随着窗口变化而变化

    // 1.jq法 <script> var winHeight = $(window).height(); $("#show").css("height&qu ...

  5. 10天学会phpWeChat——第四天:大U函数U()的使用

    在第三天,我们创建了一个"增强版"的文章模块,实现了数据从数据库到视图端展示的流程.但是我们仅仅是实现了数据列表的展示,对于文章详情等页面跳转并未涉及. 本文重点讲解phpWeCh ...

  6. JavaScript -- 练习,Dom 获取节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 获取可视区域高度赋值给div(解决document.body.clientHeight的返回值为0的问题)

    设置html,body{height:100%} 在使用html5文档类型的时候, 设置了html body的高度100%之后,两个浏览器就都能获取document.body.clientHeight ...

  8. C语言:根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,-主函数中放入一个带头节点的链表结构中,h指向链表的头节点。fun函数找出学生的最高分-使用插入排序法对字符串中的字符进行升序排序。-从文件中找到指定学号的学生数据,读入次学生数据,

    //根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,输出字母的大小与形参c一致,数量由形参d指定.例如:输入c为Y,d为4,则输出ZABC. #include <stdio.h> ...

  9. APDL获取节点和单元的结果

    目录 1. 获取节点结果 1.1 获取节点应力结果 1.2 获取节点位移结果 1.3 获取节点应变结果--总应变 1.4 获取节点应变结果--弹性应变 1.5 获取节点应变结果--塑性应变 1.6 获 ...

随机推荐

  1. Sleep-Join方法理解

    package cn.mayday.test; public class JoinTest { public static void main(String[] args) { try { int c ...

  2. 红米k30评测+全面解读

    暂时还没有图片等页面美化..其实网上有很多美图,这里不再粘贴了 红米k30是小米公司子品牌红米最近推出的一款性价比非常高的手机,以下进行多方面解读: 本人会尽量用不懂手机都能理解的语言来各方面讲解k3 ...

  3. mysql基础_操作数据库以及表

    1.数据库的操作 create database 数据库名:#一般创建方式 create database 数据库名 show databases;#查看所有数据 drop database 数据库名 ...

  4. linux基础_用户管理

    1.创建用户 基本语法 创建用户:useradd [选项] 用户名 (1)当传教用户成功后,会自动的创建和用户名同名的家目录. (2)也可以通过useradd -d 指定目录 新用户名,给新创建的用户 ...

  5. 服务器上的UID按钮

    定位用的,比如你机柜上有很多台机器,你在前面按下UID灯,机器后面也有一个UID灯会亮起来,这样当你到后面去的时候你就知道刚才在前面看的是哪一台,另外,有人通过ILO远程端口连接到你的服务器的时候,U ...

  6. C# 动态语言扩展(11)

    在 C# 4 开始添加 dynamic 类型.Mono C# 已经支持 C# 6.0 了. DLR C# 4 动态功能是 Dynamic Language Runtime (动态语言运行时,DLR)的 ...

  7. 中文录入问题 转载自:http://blog.csdn.net/ichsonx/article/details/8625925

    2.1中文录入问题 默认安装的msysgit的shell环境中无法输入中文,为了能在shell界面输入中文,需要修改配置文件/etc/inputrc,增加或修改相关配置如下: #disable/ena ...

  8. 题解 【NOIP2003】神经网络

    [NOIP2003]神经网络 Description 问题背景: 人工神经网络( Artificial Neural Network )是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷 ...

  9. [Luogu] Mayan游戏

    https://www.luogu.org/problemnew/show/P1312 太恶心了 #include <cstdio> #include <algorithm> ...

  10. 洛谷——P2058 海港

    题目传送 由于于题目保证输入的ti是递增的,所以发现当我们统计完一艘船的答案后,这个答案多少会对下一艘船的答案有贡献.同时还发现如果对每个艘船都记录他的乘客在整个数据出现的所有国籍中相应出现的次数,在 ...