完全二叉树

数据结构——树与二叉树

和自甴很熟 提交于 2020-03-29 19:01:14
目录 导言 什么是树 树结构定义 树的结点 结点分类 结点的联系 结点的层次 有序树 森林 相比线性结构 树的存储结构 双亲表示法 结构体定义 描述法举例 孩子表示法 描述法举例 结构体定义 孩子兄弟表示法 描述法举例 二叉树 二叉树的定义 特殊的二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 结构体定义 二叉树的基本操作 二叉树的遍历 从斐波那契数列说起 遍历算法 建立二叉树 拓展二叉树 建树算法 复制二叉树 获取二叉树的深度 统计二叉树的结点数 线索二叉树 描述前驱与后继 线索二叉树结点结构体定义 线索化 遍历线索二叉树 参考资料 导言 轩辕剑是一个经典的中文角色扮演游戏,通过对历史内容的考究,与精彩感人的剧情结合,使得这个系列被公认为华人世界的两大经典角色扮演游戏系列之一。我最为喜欢的两部是《轩辕剑叁:云和山的彼端》和《轩辕剑叁外传:天之痕》,剧情感人精彩、别有深意,2D的场景细致美观、独具特色……当然,我这次仍然不是来给你推荐游戏的,而是想对其中一个场景做点文章。 “建木”是上古先民崇拜的一种圣树,传说建木是沟通天地人神的桥梁,在《轩辕剑叁外传:天之痕》中的仙山岛,利用水墨画的风格进行了描绘,是我最喜欢的游戏场景之一。其中就有对“海中建木”的描绘。“海中建木”无疑是一颗巨大的树,这棵树也肯定是由无数的根、枝、叶组成的,如果我们把

二叉树的有关计算

て烟熏妆下的殇ゞ 提交于 2020-03-26 12:01:18
有关概念:https://www.cnblogs.com/schips/p/10630533.html 参考:  https://blog.csdn.net/bojie5744/article/details/30744767 计算公式 https://blog.csdn.net/stf1065716904/article/details/80874065 1. n个节点的二叉树一共有((2n)!)/(n! * (n+1)!)种   catalan数,C(n)=(1/(n+1))*((2*n)!/(n!*n!)) 2. n层二叉树的第n层最多为2^(n-1)个 3. 二叉树节点计算公式 N = n0+n1+n2,度为0的叶子节点比度为2的节点数多一个。N=1*n1+2*n2+1 4. 对任何一棵二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1 5. 具有n个节点的完全二叉树的深度为log2(n) + 1 6. B-树,除叶子与根节点以外的任意结点的分支数介于[m/2,m](取上整) 7. 具有n 个结点的完全二叉树的深度为[log2n]+1 二叉树的度计算 有一个计算二叉树节点的公式,相信很多人都知道:   度为0的节点数为度为2的节点数加1,即n0=n2+1,知道这个公式,相关题目就可以轻松解决; 下面来讨论下如何得出这个公式的: 设: k:总度数 k+1

数据结构之二叉树

限于喜欢 提交于 2020-03-16 14:57:13
某厂面试归来,发现自己落伍了!>>> 概念: 二叉树是一种特殊的树,其每个节点最多只能有两个子节点。其左子树和右子树是有顺序的,顺序不能颠倒。即使只有一个节点,也要区分左右子树。 斜树: 二叉树中每个节点只有相同方向,全部节点只有左子节点的称为左斜树,只有右子节点的称为右斜树。 满二叉树: 所有的分支节点都具有左子树和右子树,所有的叶子节点都在同一层上,满二叉树追求树的平衡。 满二叉树具备一下特点: 叶子节点只能出现在最下面一层。 非叶子节点的度数一定是2。 在同样深度的二叉树中,满二叉树的节点个数最多,叶子树最多。 完全二叉树: 对一棵具备n个节点的二叉树,对每个节点按照层序编号。如果编号为i的节点,与同样深度的满二叉树编号为i的节点在二叉树的同样位置,那么这棵二叉树就是完全二叉树。满二叉树一定是完全二叉树,完全二叉树不一定树满二叉树。 完全二叉树具备以下性质: 叶子节点只能出现在最下一层。 最下层的叶子节点一定出现在左部的连续位置。 倒数第二层的叶子节点一定出现在右部的连续位置。 同样节点数的二叉树,完全二叉树的深度最小。 性质: 一般二叉树的性质: 在非空二叉树的i层上,最多有2^(i-1)个节点。 在深度为k的二叉树上,最多有2^k-1个节点。 对于一棵非空的二叉树,如果叶子节点的个数为n0,度数为2的节点的个数为n2,则有n0=n2+1。 在一棵二叉树中,除了叶子节点

Python实现完全二叉树以及遍历

早过忘川 提交于 2020-03-11 17:57:09
在学校刚刚学到的二叉树是用C语言来实现的,还涉及到了指针等操作。最近疫情原因不能开学,就自己学习了一下Python,就拿Python来试着实现一下,顺便再复习一下二叉树的一些知识。 本文使用Python来构建一个完全二叉树,并且实现树结点添加,层次遍历,先序遍历,中序遍历,后序遍历。 由于我自己对二叉树的理解也不是很深,所以关于二叉树的理论知识就只能自行脑补了,这里直接开始实现了,在实现的过程中也可能会有一些错误,还请大佬们批评指正。 以下为实现的思路,完整代码以及输出可以直接滑倒最后查看。 创建结点 首先创建一个结点的类,结点含有数据和左子,右子,创建后就直接将左子,右子初始化为None,数据则从外部输入进去。 # 创建一个结点的class class Node(object): def __init__(self,valua): self.valua = valua self.Lchild = None self.Rchild = None 然后创建一个二叉树的类,因为结点已经创建了一个node的类,这里只需要初始化一个根结点为None就可以了。 # 创建一个二叉树class class Btree(object): def __init__(self): # 初始化根结点 self.root = None 添加结点 接下来就可以来实现添加结点的funtion类。

数据结构 - 树、二叉树、完全二叉树、真二叉树、满二叉树

血红的双手。 提交于 2020-03-10 10:13:07
01-树 节点的度:子树的个数。 树的度:所有节点度中的最大值。 叶子节点:度为0的节点。 非叶子节点:度不为0的节点。 层数:根节点在第一层,根节点的子节点在第二层,以此类推 节点的深度:从根节点到当前节点的唯一路径上的节点总数。 节点的高度:从当前节点到最远叶子节点的路径上的节点总数。 树的深度:所有节点深度中的最大值。 树的高度:所有节点高度中的最大值。 树的深度等于树的高度。 有序树:树中任意节点的子节点之间有顺序关系。 02-二叉树及其性质 二叉树: 每个节点的度最大为2(最多拥有2棵子树) 左子树和右子树是有顺序的。 即使某节点只有一棵子树,也要区分左右子树。 非空二叉树的第i层,最多有2^(i-1)个节点(i>=1) 在高度为h的二叉树上最多有2^h-1个节点(h>=1) 对于任何一棵非空二叉树,如果叶子节点个数为n0,度为2的节点个数为n2,则有:n0=n2+1 假设度为1的节点个数为n1,那么二叉树的节点总数 n = n0 + n1 + n2 二叉树的边数 T = n1 + 2*n2 = n-1 = n0 + n1 + n2 -1 03-真二叉树、满二叉树 真二叉树:所有节点的度要么是0,要么是2。 满二叉树:所有节点的度要么是0,要么是2。并且所有叶子节点都在最后一层. 在同样高度的二叉树中,满二叉树的叶子节点数量最多、总节点数量最多。 满二叉树一定是真二叉树

Java实现 LeetCode 222 完全二叉树的节点个数

淺唱寂寞╮ 提交于 2020-02-29 03:22:45
222. 完全二叉树的节点个数 给出一个完全二叉树,求出该树的节点个数。 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例: 输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int countNodes(TreeNode root) { /** 完全二叉树的高度可以直接通过不断地访问左子树就可以获取 判断左右子树的高度: 如果相等说明左子树是满二叉树, 然后进一步判断右子树的节点数(最后一层最后出现的节点必然在右子树中) 如果不等说明右子树是深度小于左子树的满二叉树, 然后进一步判断左子树的节点数(最后一层最后出现的节点必然在左子树中) **/ if (root==null) return 0; int ld = getDepth(root.left); int

数据结构——树

[亡魂溺海] 提交于 2020-02-27 22:43:34
数据结构——树 树其实就是不包含回路的连通无向图。 树的特性: 1)一棵树中的任意两个结点有且仅有唯一的一条路径连通; 2)一棵树如果有nn个结点,则它一定有n−1n−1条边; 3)在一棵树中加一条边将会构成一个回路。 树这种数据结构的用途: 例如:家族的族谱图、公司的组织结构图、书的目录等。 1. 二叉树 二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。 二叉树用范围最广。一颗多叉树也可以转化为二叉树。 1) 满二叉树 :二叉树中每个内部节点都有两个儿子。满二叉树所有的叶节点都有相同的深度。 满二叉树是一棵深度为h且有2h−12h−1个结点的二叉树。 2) 完全二叉树 :若设二叉树的高度为hh,除了第hh层外,其他层的结点数都达到最大个数,第h层从右向左连续 缺若干个结点,则为完全二叉树。 特点: 由上图发现: 1)如果一棵完全二叉树的父节点编号为KK,则其左儿子的编号是2K2K,右儿子的结点编号为2K+12K+1, 公式总结: 2)已知完全二叉树的总节点数为n求叶子节点个数: 当n为奇数时:(n+1)/2 当n为偶数时 : (n)/2 3)已知完全二叉树的总节点数为n求父节点个数:为:n/2 4)已知完全二叉树的总节点数为n求叶子节点为2的父节点个数: 当n为奇数时:n/2 当n为偶数时 : n/2-1 5)如果一棵完全二叉树有N个结点,那么这棵二叉树的深度为

判断是否是完全二叉树

给你一囗甜甜゛ 提交于 2020-02-23 11:10:10
判断一棵树是否是完全二叉树的思路 1>如果树为空,则直接返回错 2>如果树不为空:层序遍历二叉树 2.1>如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列; 2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树; 2.2>如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树; bool check(BiTree T) { if (T == NULL) return false; queue<BiTree> Q; Q.push(T); while (!Q.empty()) { BiTree p = Q.front(); Q.pop(); if (p->left && p->right) { Q.push(p->left); Q.push(p->right); } else if(p->right && p-left == NULL) return false; else { if(p->left && p-right == NULL) Q.push(p->left); while(!Q.empty()) { p = Q.front(); Q.pop(); if(p->left || p->right) return false; } } } return

错题本——数据结构(堆)

穿精又带淫゛_ 提交于 2020-02-15 05:38:11
堆 下标从1开始,在含有n个关键字的小根堆(堆顶元素最小)中,关键字最大的记录有可能存储在( )的位置上 A [n/2] B [n/2]-1 C 1 D [n/2]+2 解析: 小根堆中最大的数一定是放在叶子节点上,堆本身是个完全二叉树,完全二叉树的叶子节点的位置大于 [ n / 2 ] [n/2] [ n / 2 ] 补充: 完全二叉树的顺序结构 对于一个完全二叉树,假设它有n个结点,对结点进行从1开始编号,对任一结点 i 满足下面: 它的双亲是结点 i/2 (除了i=1的情况) 左孩子是 2i 右孩子是 2i+1 如果2i>n 说明无左孩子 2i+1>n 说明无右孩子 如. 来源: CSDN 作者: 白羊_Aries 链接: https://blog.csdn.net/qq_38204302/article/details/104311184

非线性数据结构——树

微笑、不失礼 提交于 2020-02-08 16:52:52
树 非线性数据结构定义:也就是每个元素可以有多个前驱和后继。树是一种非线性结构。它可以有两种定义。 第一种:树是n(n>=0, n为0时,称为空树 )个元素的集合,它只有 一个特殊的没有前驱的元素 ,这个元素成为树的 根(root) ,而且 树中除了根节点外,其余的元素都只能有一个前驱,可以有0个或者多个后继。 第二种递归定义:树T是n(n>=0,n为0时,称为空树)个元素的集合,它有且只有一个特殊元素根,剩余元素都可以被划分为M个互不相交的集合T1,T2,T3……、Tm,而每一个集合都是树,称为T的子树subtree,同时,子树也有自己的根。 维基百科是这样定义的: 树中的概念 结点: 树中的数据元素,也就是上图中的,A,B,C,D,E,F,G…… 结点的度degree :节点拥有的子树的数目称为度,记作d(v)。 叶子结结: 节点的度为0,称为叶子节点leaf,终端节点,末端节点。 分支结点: 节点的度不为0,称为非终端节点或分支节点。 分支: 节点之间的关系。 内部节点: 除根节点外的分支节点,当然也不包括叶子节点。 树的度: 树内各节点的度的最大值,比如下面这个图D节点的度最大为3,所以树的度数就是3. 孩子(儿子child)节点: 节点的子树的根节点成为该节点的孩子。 双亲(父parent)节点: 一个节点是他各子树的根节点的双亲。 兄弟(sibling)节点: