关闭

完全二叉树和满二叉树的区别+完全二叉树求节点问题

标签: 满二叉树完全二叉树
237人阅读 评论(0) 收藏 举报

今天复习了下二叉树的相关知识,发现很多都忘掉了,所以在此记录下

满二叉树


如图,顾名思义,满二叉树说白了其实就是除了最后一层,所有节点都有两个孩子,
所以:
假设现在有一棵深度为N的满二叉树:
总结点数就是2^N-1(计算公式:2^0 + 2^1 +…+2^(N-1))
叶子节点数就是2^(N-1)(上图中叶子节点也就是第三层的节点数位2^2 = 4)

完全二叉树


如图,完全二叉树就是除了最后一排,其余的都是满二叉树,最后一排的节点都连续靠左。
所以:
如果给定了一个完全二叉树的总结点数,那么对应应该可以求出他的叶子节点数已经深度。
例如:总结点数位770,求叶子节点

方法一:(详细步骤)

如下:
2^9 - 1 = 511 < 770
2^10 - 1 = 1023 >770
所以 这个完全二叉树一共有10层;前9层总结点是511,所以第10层的叶子节点为770 - 511 = 259,
*特别注意*
因为最后一层不是满的,所以倒数第二层也露出了一些节点,那些节点也算是叶子节点!
第9层总结点数为 2*(9-1) = 256,
第10层一共259个叶子节点,他们的父节点是在第9层的,也就是round(259/2)(向上取整 = 130)这么多个第9层节点延伸下来的,也就是第9层这些节点是有孩子的,剩下的256 - 130 = 126没有孩子,也是算叶子节点的。
所以总共 126 + 259 = 385个叶子节点。

方法二(简便算法)

如下:
首先了解下定义:
有两个子节点的节点叫做度数为2的节点,这里称作D2
有一个子节点的节点叫做度数为1的节点,这里称作D1
有0个子节点的节点叫做度数为0的节点,这里称作D0(叶子节点)
于是:
总节点数=D2 + D1 + D0
另外:
D2它会产生两个新节点,D1产生一个新节点,还有一个根节点本身就存在
所以总结点数 = D2 * 2 + D1 * 1 + 1
联合两个方程得到:
D2 + 1 = D0
也就是度数为0的节点数总是比度数为2的节点数多1个
了解这一点很重要!!!

好了,下面开始简单运算过程:
假设总结点数为N,那么就有:
N = D2 + D1 + D0
又因为之前上面提到 D2 + 1 = D0,所以
N = D0 - 1 + D1 + D0
N = 2D0 + D1 - 1

注意:充分了解完全二叉树的定义可知,度为1的节点只有可能为0或者1
所以,D1 = 1 OR 0,两种情况都带入
D1 = 0时:
N = 2D0 - 1
D0 = (N + 1) / 2
D1 = 1时:
N = 2D0
D0 = N / 2
D0是个整数,所以D0 = N / 2(向上取整)

总结:
叶子节点数 = 总结点数 / 2 (向上取整)

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

求二叉树中两个节点的最近公共父节点

问题分为三种情况: 1、root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点。 2、节点只有左、右指针,没有parent指针,root已知 思路:有两种情况,一是要找的这两个节点(a, b),在要遍历...
  • naruto_002
  • naruto_002
  • 2017-04-06 09:59
  • 349

二叉树中两个节点的最近公共祖先节点

题目:求二叉树中两个节点的最近公共祖先节点 一、该二叉树为搜索二叉树 搜索二叉树的特点: 任意一个节点的左子树的所有节点值都比该节点的值小,其右子树的所有节点值都比该节点的值大。 解决该问题方法: 从树的根节点开始和两个节点作比较,如果当前节点的值比两个节点的值都大,则这两个节点的最近公共祖先节点一...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016-08-04 23:43
  • 8868

基本数据结构——二叉树的建立,遍历,求叶子节点,深度计算

/* 新建立一棵二叉树,遍历,查找树的高度,查找树的叶子节点,和总结点数计算距离最远的两个节点。 SQ 2014-04-20 */ #include struct Node{     int data;     struc...
  • u012606764
  • u012606764
  • 2014-04-20 21:55
  • 1610

所有节点对最短路径

我们这里讲解三个算法,第一个是利用传统的动态规划,第二个也是个动态规划算法,但是基于一种观察结果,他就是warshall算法,第三个算法是将问题转换为没有负数权重的图,再对每个节点调用Dijkstra算法,他就是Johnson算法。
  • qq_23014515
  • qq_23014515
  • 2016-05-18 13:04
  • 4018

求二叉树的任意两个节点的最近公共祖先

 二叉查找树   如果该二叉树是二叉查找树,那么求解LCA十分简单。 基本思想为:从树根开始,该节点的值为t,如果t大于t1和t2,说明t1和t2都位于t的左侧,所以它们的共同祖先必定在t的左子树中,从t.left开始搜索;如果t小于t1和t2,说明t1和t2都位于t的右侧,...
  • Manketon
  • Manketon
  • 2014-09-24 15:55
  • 1120

二叉树中节点的最大距离

微软面试题之一,难度系数中,题目描述如下: 求二叉树中节点的最大距离...  如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,  我们姑且定义"距离"为两节点之间边的个数。  写一个程序,  求一棵二叉树中相距最远的两个节点之间...
  • pediy_yuhan
  • pediy_yuhan
  • 2014-01-21 19:46
  • 5225

二叉树系列——二叉树的最大距离(即相距最远的两个叶子节点,编程之美,百度面试题)

来自于编程之美3.8。 题目:如果我们把二叉树看做图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 如下图所示,树中相距最远的两个节点为A,B,最大距离为6。 书上对这个问题的分析是很清楚的,计算一个二叉树的...
  • liuyi1207164339
  • liuyi1207164339
  • 2016-03-15 21:23
  • 4329

输入一颗二叉树的根节点,求该树的深度

算法描述: 输入一颗二叉树的根节点,求该树的深度,从根节点到叶节点依次经过的结点形成一条路径,最长路径的长度为树的深度 算法实现: /************************************************************************* ...
  • yiluohan0307
  • yiluohan0307
  • 2016-04-15 09:27
  • 314

二叉树中两个节点的最近公共祖先节点方法全集

一.如果数据结构为三叉链表,即含有指向父节点的指针: Node * NearestCommonAncestor(Node * root,Node * p,Node * q) { Node * temp; while(p!=NULL) { p=p->parent; temp=q;...
  • github_35124642
  • github_35124642
  • 2016-06-15 21:28
  • 869

[XML]元素与节点的区别与联系

一、xmlnode类节点: xmlnode类表示xml文档中的单个节点,其命名空间为:System。Xml XmlNode的三个最主要的子类包括:XmlDocument、XmlDataDocument及XmlDocumentFragment 1.XmlNode类的属性: public virtual...
  • u010492096
  • u010492096
  • 2014-02-19 10:11
  • 1478
    个人资料
    • 访问:2807次
    • 积分:48
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:3篇
    • 译文:0篇
    • 评论:1条
    文章存档
    最新评论