二叉树实例学习(四)——获取节点的高度函数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 获 ...
随机推荐
- 挺棒的七个Python图形应用GUI开发框架
作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,目前市场上有大量Python GUI开发框架可供选择,Python wiki GUI programming给出了超过30个跨平 ...
- Python: sqlite3模块
sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块 SQLite 是一个C语言库,它可以提供一种轻量级的基于磁盘的数据库,这种数据库不需要独立的服务器进程,也允许需要使用一种 ...
- c#系统泛型委托
Action<T> 无返回值的系统泛型委托 namespace ConsoleApp1 { public class UserInfo { public int Id { get; set ...
- [唐胡璐]QTP技巧 - QTP菜单项消失
有时候QTP的菜单栏的下拉菜单为空。 解决方法:在菜单栏点击右键,选择“Customize”,在Customize窗口的ToolBarTab页,点击“Restore All”后即可。
- opengles reference card
https://www.khronos.org/files/opengles31-quick-reference-card.pdf https://www.khronos.org/opengles/s ...
- Springboot打包成jar包形式发布
1.修改配置文件pom.xml 添加打包形式设置为jar形式 <packaging>jar</packaging> 2.在build标签内添加内容如下 finalname为打包 ...
- Win7 : 'java' is not recognized as internal or external command,
Java application is not working in Win 7 64-bit http://answers.microsoft.com/en-us/windows/forum/win ...
- 【luoguP3243】[HNOI2015]菜肴制作--拓扑排序
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...
- 使用Camtasia 9 录制屏幕软件
Camtasia 9 录制屏幕软件,并且有丰富的专业剪辑功能.
- 学数据分析到底要不要掌握Linux-Python基础前传(2)
使用Python的数据分析师到底要不要掌握Linux? 对于上面的问题,大部分的答案是Python数据分析在windows的环境下跑跑就可以了,没有必要再花时间来学习Linux; 这里jacky有一个 ...