树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. Java入门第三季——Java中的集合框架(中):Map&HashMap

    package com.imooc.collection; import java.util.HashSet; import java.util.Set; /** * 学生类 * @author Ad ...

  2. Redis入门(一)

    Redis入门 什么是Redis Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库,属于非关系型数据库的一种(NoSQL). Redis 与其他 key - val ...

  3. loj515 「LibreOJ β Round #2」贪心只能过样例[bitset+bool背包]

    由于bitset极其不熟练且在实际题目中想不起来运用它来优化,于是练了几道题. 这题是一个分组的bool背包,每组必须选一个,暴力的话是$O(n^5)$. 如果dp数组不要一维滚动的话,有两种枚举方法 ...

  4. sql random string

    begindeclare chars_str varchar(62) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123 ...

  5. json注解及序列化

    一.json框架 市面上的json框架常用的有 jackson.gson.fastjson.大家比较推崇的是fastjson,但是springmvc默认集成的是 jackson. 在一个项目中建议一个 ...

  6. Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) E. Vasya and Good Sequences(DP)

    题目链接:http://codeforces.com/contest/1058/problem/E 题意:给出 n 个数,对于一个选定的区间,区间内的数可以通过重新排列二进制数的位置得到一个新的数,问 ...

  7. 报错Too many connections

    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establish ...

  8. EasyLogging++学习笔记(1)—— 简要介绍

    对于有开发经验的程序员来说,记录程序执行日志是一件必不可少的事情.通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速.准确地定位问题.在现在这个开 ...

  9. BZOJ 2346: [Baltic 2011]Lamp Dijkstra

    不难发现如果一个边的方向改变,就一定不会改回来(这样肯定不是最短路). 所以就直接建双向边,边权为 $0$ 代表不改变,边权为 $1$ 代表改变,跑一个最短路即可. #include <bits ...

  10. noi 2011

    描述 已知长度最大为200位的正整数n,请求出2011^n的后四位. 输入 第一行为一个正整数k,代表有k组数据,k<=200接下来的k行, 每行都有一个正整数n,n的位数<=200 输出 ...