二叉树实例学习(四)——获取节点的高度函数getHight()
树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()的更多相关文章
- 父级(display:none)隐藏时,子节点的高度获取。
当父节点display:none的时候,子节点的高度是0获取不到. 解决办法:用visibility替换display就可以了.
- 二叉树系列 - 求两节点的最低公共祖先,例 剑指Offer 50
前言 本篇是对二叉树系列中求最低公共祖先类题目的讨论. 题目 对于给定二叉树,输入两个树节点,求它们的最低公共祖先. 思考:这其实并不单单是一道题目,解题的过程中,要先弄清楚这棵二叉树有没有一些特殊的 ...
- day 83 Vue学习四之过滤器、钩子函数、路由、全家桶等
Vue学习四之过滤器.钩子函数.路由.全家桶等 本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤 ...
- 动态获取div的高度 随着窗口变化而变化
// 1.jq法 <script> var winHeight = $(window).height(); $("#show").css("height&qu ...
- 10天学会phpWeChat——第四天:大U函数U()的使用
在第三天,我们创建了一个"增强版"的文章模块,实现了数据从数据库到视图端展示的流程.但是我们仅仅是实现了数据列表的展示,对于文章详情等页面跳转并未涉及. 本文重点讲解phpWeCh ...
- JavaScript -- 练习,Dom 获取节点
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 获取可视区域高度赋值给div(解决document.body.clientHeight的返回值为0的问题)
设置html,body{height:100%} 在使用html5文档类型的时候, 设置了html body的高度100%之后,两个浏览器就都能获取document.body.clientHeight ...
- C语言:根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,-主函数中放入一个带头节点的链表结构中,h指向链表的头节点。fun函数找出学生的最高分-使用插入排序法对字符串中的字符进行升序排序。-从文件中找到指定学号的学生数据,读入次学生数据,
//根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,输出字母的大小与形参c一致,数量由形参d指定.例如:输入c为Y,d为4,则输出ZABC. #include <stdio.h> ...
- APDL获取节点和单元的结果
目录 1. 获取节点结果 1.1 获取节点应力结果 1.2 获取节点位移结果 1.3 获取节点应变结果--总应变 1.4 获取节点应变结果--弹性应变 1.5 获取节点应变结果--塑性应变 1.6 获 ...
随机推荐
- pycharm连接云端mysql
在阿里云上安装了一个mysql,打算用windows系统上面装的pycharm来操作 首先,右端有个database,点开它,点开加号 这里,general填的是mysql上面设置的密码,端口不用改了 ...
- Hive启动报错Terminal initialization failed; falling back to unsupported java.lang.Incomp
这个报错需要删除hadoop目录下,需要删除下面目录下的文件,重启hadoop和hive即可 $HADOOP_HOME/share/hadoop/yarn/lib/jline-0.9.94.jar
- Java web中不同浏览器间导出Excel文件名称乱码问题解决方案
问题描述: 对于不同浏览器存在对中文编码格式问题,从而在导出Excel文件时,中文文件名出现乱码的情况,即在程序中给要导出的文件指定一个中文名字时,在浏览器上出现的下载框中的文件名出现了乱码,解决如下 ...
- Springboot项目关闭Httpclient的Debug日志
今天在做httpclient测试时,发现控制台打印了好多请求相关的信息,如何去掉这些不打印? (2)在配置文件包下加入logback.xml文件,文件内容如下: <?xml version=&q ...
- 查看nginx服务器状态
编译安装时使用--with-http_stub_status_module开启状态页面模块 [root@proxy ~]# yum -y install gcc pcre-devel openssl- ...
- P2502 [HAOI2006]旅行 最小生成树
思路:枚举边集,最小生成树 提交:1次 题解:枚举最长边,添加较小边. #include<cstdio> #include<iostream> #include<algo ...
- 事件驱动和IO操作
事件驱动和异步IO 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到一 ...
- python 输出三角形
pattern = input("请输入你要选择的模式:") while True: if pattern == "A": row = eval(input(& ...
- 使用Spring基于应用层实现读写分离(一)基础版
背景 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案, 其中一个是主库,负责写入数据,我们称之为:写库: 其它都是从库,负责读取数据 ...
- 预处理、const、static、sizeof-为什么inline能很好地取代表达式形式的预定义
1:有如下几种原因: (1)inline定义的类的内联函数,函数的代码被放在符号表中,在使用时直接进行替换(像宏一样展开),没有了调用的开销,效率也很高. (2)类的内联函数也是一个真正的函数.编译器 ...