孩子兄弟存储结构的几个统计算法实现

@(算法学习)

  1. 编程求得以孩子兄弟表示法存储的森林的叶子结点个数。

分析:首先得理清楚题意:计算的是原始的森林的叶子结点数。这个才是有意义的计算,否则计算出存储森林的二叉树的叶子结点数并没多大实用价值。OK,那么分析森林中的叶子结点在孩子结点的存储格式下的特点:左孩子指针域为空。该怎么理解这个?
说到这里,需要特别强调的是孩子兄弟表示法中的一个小细节。

在原来的树中B是A的右孩子,那么在孩子兄弟表示法中,B还是A的右孩子吗?答案肯定是:不是。既然孩子兄弟表示左孩子右兄弟,就全部遵守这个规则!
为什么这么问,是因为我构造了下面这个树形:

转化为孩子兄弟存储结构:

最终树形该是怎样的?

这样?肯定不对啊,D是B的孩子,现在会被解读成B的兄弟!

因此下面的才是对的!

这是个小的知识点,但是决定了对叶结点的计数算法。

我们看非叶结点的形状:

变成孩子兄弟存储后:

左指针全部占用。而只有叶子结点没有任何孩子,因此左指针为空,这是个可逆的命题:左指针为空则为叶子结点。

有了这个认识,再写算法就不难了。只要用递归算法:

#include <iostream>
using namespace std;typedef struct Node
{int x;struct Node *leftChild;struct Node *rightSibling;
} Node,*Tree;// 编程求得孩子兄弟表示法存储的森林的叶子结点的个数
// 递归的思路:结点无孩子则该结点必为叶子结点
int CountLeaves(Tree root)
{if(!root) // 如果树为空则返回0{return 0;}if(root->leftChild == NULL) //树不空,如果左孩子为空,那么该结点是叶子,再递归计算兄弟子树的叶子结点数{return 1+CountLeaves(root->rightSibling);}else // 否则就是分别递归计算左孩子子树的叶子结点数和右兄弟叶子结点数之和{return CountLeaves(root->leftChild) + CountLeaves(root->rightSibling);}
}

2.编程求兄弟孩子链表存储结构的树的深度。

分析:这个只需要考虑到左孩子是下一层,右兄弟是同一层即可。也即:左孩子子树的高度+1(+1是根占一层)和右兄弟子树的高较大者。

int height(Tree root)
{int hchild,hsibling;if(root == NULL){return 0;}else{hchild = height(root->leftChild);hsibling = height(root->rightSibling);if(hchild + 1 > hsibling){return hchild + 1;}else{return hsibling;}}
}

3.已知一棵树的层次序列以及每个结点的度,编写算法构造此树的孩子兄弟链表。

// 待更新。

孩子兄弟存储结构的几个统计算法实现相关推荐

  1. 族谱管理系统(孩子兄弟存储结构)

    */* Copyright (c) 2016,烟台大学计算机与控制工程学院* All rights reserved.* 文件名:test.cpp* 作者:常轩* 微信公众号:Worldhello* ...

  2. 线性表之链式存储结构_单链表相关算法

    在存储结构上,不需要连续的存储空间,需要上一个结点的指针域 指向下一个结点即可,找到一个结点就可以找到下一个结点. 学习教材是大话数据结构,加上自己的一些个人理解.这个算法 有点绕,需要对指针 相关内 ...

  3. 树的存储结构(树的二叉链表(孩子—兄弟))

    // c6-5.h 树的二叉链表(孩子-兄弟)存储结构(见图6.32) typedef struct CSNode {TElemType data;CSNode *firstchild,*nextsi ...

  4. 树的存储结构以及实现代码

    树的存储结构以及实现代码   1.首先假设有一个树如下: 2.双亲表示法 我们假设以一组连续空间存储树的结点,在每个结点中,附设一个指示器指示其双亲结点到链表中的位置.这样,每个结点除了知道自己是谁以 ...

  5. 树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)

    文章目录 一. 树的概念 二. 树的存储结构 (一). 双亲表示法 (二). 孩子表示法 1. 定长结点链表存储结构 2. 孩子链表存储结构 (三). 孩子兄弟表示法 一. 树的概念 树(Tree)是 ...

  6. java 孩子节点所有_树的孩子-兄弟结点存储之Java实现

    /** * 本类为树(孩子-兄弟存储)的结点 * * @version 1.0, 2008-01-24 * @author 李赫元 北京交通大学 * @since JDK1.6 */ public c ...

  7. 设树采用孩子兄弟表示法存放.用类c语言设计算法计算树的高度.,(数据结构课程设计分类题目.doc...

    (数据结构课程设计分类题目 线性表 顺序表: 1.设有一元素为整数的线性表L=(a1,a2,a3,-,an),存放在一维数组A[N]中,设计一个算法,以表中an作为参考元素,将该表分为左.右两部分,其 ...

  8. 树的存储结构-孩子兄弟表示法

    实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点 代码如下: #include <iostream> using namespace st ...

  9. 以孩子兄弟链表为存储结构,请设计递归算法求树的高度

    题目:以孩子兄弟链表为存储结构,请设计递归算法求树的高度 分析:如果只有根节点,那么高度为1,如果有左孩子,那么高度由左孩子的左子树和右子树决定,取其大者. 代码如下: typedef struct ...

  10. 数据结构c语言——树的三种存储结构(双亲表示法、孩子表示法、兄弟表示法)

    在大量的应用中,人们曾使用多种形式的存储结构来表示树.这里,我们介绍3种常用的链表结构. 1.双亲表示法: 假设以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置, ...

最新文章

  1. python中取整数的几种方法
  2. 【译】Attacks against machine learning — an overview
  3. 剑指Offer_61_序列化二叉树
  4. 如何用CSS让一个容器水平垂直居中?
  5. linux之tr命令使用和总结
  6. 华为P40渲染图再曝光:果然是年度真旗舰
  7. arm linux gcc交叉编译,arm-linux-gcc交叉编译器安装
  8. python条件判断天气_Python小课—条件判断—学习笔记(4)
  9. matlab中mov是什么意思,PLC编程中MOV是什么意思
  10. 人脸识别+表情识别系统
  11. AT32 MCU低功耗模式--AT_SURF案例19
  12. 大华摄像头WEB页面集成
  13. 用PyTorch进行手写数字识别
  14. 写给自己的学习计划(迷惘找不到方向的时候就看
  15. 提问 未来计算机的发展趋势是什么,计算机今后的发展趋势是什么?
  16. ​中国涂装行业市场调研分析及十四五发展前景展望报告2021年版
  17. 终端显示env: node\r: No such file or directory的解决办法
  18. 基于C#开发一款益智类一笔画小游戏
  19. 家长如何帮助沉迷网络的孩子[为本教育]
  20. 华为交换机配置时区_S5700系统时区不同于UTC时区导致NTP同步失败

热门文章

  1. Python:实现currency converter货币换算算法(附完整源码)
  2. GB/T 20984-2022《信息安全技术 信息安全风险评估方法》解读
  3. 【花雕动手做】有趣好玩的音乐可视化系列小项目(22)--LED无限魔方
  4. Oracle 12C Sharding部署和测试
  5. 127.0.0.1 已拒绝连接
  6. 一个页面中有多个audio标签,其中一个播放结束后自动播放下一个,audio连续播放
  7. 鲲鹏大数据解决方案拆解:用硬实力跨越技术与应用的鸿沟
  8. 选取域名需要注意的几个方面
  9. 什么是ts(typeScript)
  10. RestTemplate 超时值