在二叉树的基础上,我们可以扩展出任意多个叉的树。即,多叉树。然而,此时又面临着另外一个问题:

  • 当孩子结点无限制时,我们并不知道预先要分配多少个属性,且当仅有少数元素拥有多个子节点时,将会造成大量的空间浪费。

此时,提出了一种新的表示形式:

l e f t − c h i l d r i g h t − s i b l i n g r e p r e s e n t a t i o n left-child \quad right-sibling \quad representation left−childright−siblingrepresentation。

左孩子右兄弟表示法

对于任意一个结点T,其仅包含两个指针:

  1. T.left-child,指向T结点的最左侧子节点。
  2. T.right-sibling,指向T右侧最邻近的兄弟结点。

特别的,当二者不存在时,相应的指针皆为空,即NIL。该方法只需要 O ( n ) O(n) O(n)空间来存储含 n n n个结点的树。

由于其与二叉树的相似性,故又叫树的二叉树表示法

在此,给出一个样例:

该样例旨在为下述算法提供一个参考。

相关算法

深度

对于该种树而言,任意一个节点和其右节点的深度相同。也就意味着对于一个节点T,其高度为要么和右子树高度相同,要么比左子树低一层。从叶子节点向上递归,即可得出最大深度。即:

int Height(Tree& t){if(t == nullptr) return 0;return Height(t->left) + 1 > Height(t->right) ? Height(t->left) + 1 : Height(t->right);
}

叶子节点数

基于二叉树中的定义,叶子节点是没有子节点的节点。在该种表示方法中,即左指针为空的节点(某一层的最后一个叶子节点右子树也为空,故只看左指针就行)。对于一个节点的叶子节点数,即:

int Count(Tree& t){if(t == nullptr) return 0;if(t->left == nullptr) return 1;return Count(t->left) + Count(t->right);
}

遍历

先序遍历

先序遍历,对于某个节点而言,其左指针第一个子节点。向左指针递归即寻找孩子,回溯时输出右指针的兄弟。与二叉树的先序遍历完全一致。

void preOrder(Tree& t){if(t == nullptr) return;cout<<t->val<<" "; //输出值TreeNode* p = t->left;while(p != nullptr){preOrder(p);p = p->right;}
}

后序遍历

后序遍历过程中,对于一个节点,应该打印其左指针和全部右侧的节点后才打印该节点,即回溯时才打印当前节点。

void PostOrder(Tree& t){if(t == nullptr) return;TreeNode* p = t->left;while(p != nullptr){PostOrder(p);   //递归找“根”p = p->right;}cout<<t->val<<" ";
}

层序遍历

层序遍历,即类似于广度优先算法。对于一个节点,当打印左节点时,应将其右侧所有兄弟节点都打印再去下一层。打印其兄弟节点时,保留其左节点,即其子节点的兄弟。基于此,也可统计出每层的宽度。有注释的几行即为相应的宽度统计。

void levelOrder(Tree& t){if(t == nullptr) return;queue<TreeNode*> q;TreeNode* p;int max = INT_MIN; //宽度q.push(t);while(!q.empty()){int width = q.size();       for(int i = 0;i < width;i ++){p = q.front();q.pop();cout<<p->val<<" ";p = p->left;while(p != nullptr){q.push(p);p = p->right;}}max = max > width ? max: width;        //一层遍历结束 统计宽度cout<<endl;}return max;           //返回宽度
}

搭建了个个人blog,感兴趣的话来玩呀。

多叉树的二叉树表示法(左儿子右兄弟)相关推荐

  1. 第十二届蓝桥杯省赛A组试题:左儿子右兄弟Java

    [问题描述] 对于一棵多叉树,我们可以通过 "左孩子右兄弟" 表示法,将其转化成一棵二叉树.如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一.换句话说,每个结点可以 ...

  2. 3422. 左孩子右兄弟

    对于一棵多叉树,我们可以通过 "左孩子右兄弟" 表示法,将其转化成一棵二叉树. 如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一. 换句话说,每个结点可以选任意子结 ...

  3. 辅助类BinaryTreeNodeLeftChildRightSibling(左孩子右兄弟,二叉树结点)

    辅助类BinaryTreeNodeLeftChildRightSibling(左孩子右兄弟,二叉树结点) template<typename T> class BinaryTreeNode ...

  4. java实现家庭关系图_左孩子右兄弟二叉树实现家族家谱

    /* Name: 家谱 Description: 本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息.插入家族成员.删除家族成员等功能. */ #include #include using ...

  5. 蓝桥杯 左baby右兄弟

    试题: 思路: "左孩子右兄弟"是常见的多叉树转化成二叉树的方法.具体的实现方式是,从第二层最右边的结点开始,将将自己的孩子结点放到左边,左边一位的兄弟放到左边的结点上.对于是多支 ...

  6. strcmp() Anyone? UVA - 11732 左孩子右兄弟Trie/计数

    #include<bits/stdc++.h> using namespace std; #define ll long longconst int maxnode = 4000 * 10 ...

  7. left-child right-sibling representation of tree - 左孩子右兄弟表示树

    left-child right-sibling representation of tree - 左孩子右兄弟表示树 child-sibling representation, left-child ...

  8. 试题H 左Children右兄弟

    (吐槽:为什么不能使用'孩'和'子'这两个字) 题目链接:https://www.lanqiao.cn/courses/2786/learning/?id=280825 题目解析:典型的树形DP 记d ...

  9. 【PAT天梯】【L2-2 小字辈(左子右兄加强版)】(树,水题)

    题干: L2-2 小字辈(左子右兄加强版) (25 分) 本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 需要注意的是,家族成员的输入方式,是按照"Left-child Right- ...

最新文章

  1. php 任意文件上传,任意文件上传漏洞
  2. GitHub超3k星!从Python代码到APP只需要一个小工具~
  3. 模型算法-支持向量机SVM
  4. log4j 日志级别_Qt使用Log4Qt写日志
  5. Python使用tkinter的Treeview组件实现表格功能
  6. tcp长连接java_聊聊 TCP 长连接和心跳那些事
  7. SQL:2016标准概念之数据类型
  8. 器件基础知识——电容
  9. 由于您的系统没有安装html help,win10遇到“您未安装FLASH控件”的提示怎么办
  10. 城市地铁类毕业论文文献包含哪些?
  11. 大组合数取模hdu5698 瞬间移动
  12. Ubuntu 15.10 x64 安装 Android SDK
  13. JSP 银行网上账户管理系统myeclipse编程java网页
  14. 谭的c语言,c语言 谭
  15. 推荐一个开源快速开发erp管理系统的框架
  16. android手机震动
  17. visio2013每次打开都进行设置 解决办法
  18. vue 高德地图api爬坑之路(三)Autocomplete 和 PlaceSearch
  19. 阿里云云计算的类型和特点
  20. 机器人课程教师面对的困境有哪些

热门文章

  1. greenplum 中的 vacuum
  2. Rust学习总结之HashMap
  3. 关于 Android studio你的主机中的软件中止了一个已建立的连接 Gradle build failed with 1 error(s) in 3 s 487 ms
  4. 行业研究-全球与中国业务流程文档工具市场现状及未来发展趋势
  5. 第十届“图灵杯”NEUQ-ACM程序设计竞赛个人赛解题报告
  6. Q版人物绘画教程|怎么画萌萌的Q版角色
  7. wps如何删除括号里的内容_文档中怎么批量去除括号里面的答案 - 卡饭网
  8. 最新期货交易时间一览表(日盘+夜盘)2017年3月更新
  9. html 给table赋值,js给table赋值
  10. RayVentory更智能的软件和硬件库存