二叉树实例学习(四)——获取节点的高度函数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 获 ...
随机推荐
- template.js 求和 问题
基本适应方法在这不做叙述 <table> <tr> <th>值</th> <th>值</th> <th>值</ ...
- CentOS7下tftp服务安装配置
1.软件包安装 root用户或者普通用户使用sudo权限执行如下命令: yum install xinetd tftp tftp-server # root 用户执行 sudo yum install ...
- NativeRenderingPlugin IOS
https://bitbucket.org/Unity-Technologies/graphicsdemos/src/77f014c12161e5c25d902e2c5697dd0c45ce3e35/ ...
- (四)关于java.lang.IllegalMonitorStateException异常说明
1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...
- shell编程expr表达式----传智播客的书linux编程基础中出现的问题
首先声明:本人是传智播客的粉丝,拥有他出的多本编程书籍,此文绝无诋毁抹黑之意. 但在linux系统编程第88页给出的while循环范例中,代码运行无法得到预期结果 原代码如下 #!/bin/sh su ...
- struts2模糊查询
dao层 public interface DimDao { //一个条件 public List<User> userdim(User user); //两个条件且关联表格 public ...
- 自己编写一个Java监听器
Java监听器 1.原理: 当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法. 例如:创建一个“人”类Class Person 人拥有吃的方法public void eat(){},我 ...
- Kafka集群---分布式消息系统
概念: kafka是一种消息中间件 作用: 解耦.冗余.提高扩展性.缓冲 保证顺序.灵活.削峰填谷 异步通信 kafla角色 producer: 生产者,负责发布消息 consumer: 消费者,负责 ...
- 两种dp模型
两个常见模型 bzoj 4321 题意:编号为1~n的人排成一排,问有多少种排法使得任意相邻两人的编号之差不为1或-1. n<=1000 排列计数问题:考虑把数从小到大插入的过程进行dp. 设 ...
- OI程序常见的设计陷阱
宏定义的问题 有时候为了方便,我会大量使用宏定义.但是最近我发现下面这两个宏定义老是出问题: #define SET(x,a) memset(x,a,sizeof(x)) inline void wo ...