怎样推断一棵二叉树是全然二叉树

严蔚敏那本教材上的说法:一个深度为k,节点个数为 2^k - 1 的二叉树为满二叉树。这个概念非常好理解,

就是一棵树,深度为k,而且没有空位。

首先对满二叉树依照广度优先遍历(从左到右)的顺序进行编号。

一颗深度为k二叉树,有n个节点,然后,也对这棵树进行编号,假设全部的编号都和满二叉树相应,那么这棵树是全然二叉树。

随意的一个二叉树,都能够补成一个满二叉树。这样中间就会有非常多空洞。在广度优先遍历的时候,假设是满二叉树,或者全然二叉树,这些空洞是在广度优先的遍历的末尾,所以,但我们遍历到空洞的时候,整个二叉树就已经遍历完毕了。而假设,是非全然二叉树,

我们遍历到空洞的时候,就会发现,空洞后面还有没有遍历到的值。这样,仅仅要依据是否遍历到空洞,整个树的遍历是否结束来推断是否是全然的二叉树。

算法例如以下:

bool is_complete(tree *root)
{
queue q;
tree *ptr;
// 进行广度优先遍历(层次遍历),并把NULL节点也放入队列
q.push(root);
while ((ptr = q.pop()) != NULL)
{
q.push(ptr->left);
q.push(ptr->right);
}

// 推断是否还有未被訪问到的节点
while (!q.is_empty())
{
ptr = q.pop();

// 有未訪问到的的非NULL节点,则树存在空洞,为非全然二叉树
if (NULL != ptr)
{
return false;
}
}

return true;
}

时间: 2024-12-30 04:21:59

怎样推断一棵二叉树是全然二叉树的相关文章

C++ 推断一棵二叉树是否对称

一棵二叉树对称,就是说它假设以根为轴,翻转过去一样.例如以下图所看到的,以虚线为轴.把左边翻转到右边,各顶点及顶点中的值一一相应. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT3J0aG9jZW50ZXJDaG9jb2xhdGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 注意,它并不要求单独看子树的时候子树也是对称的,例如以下图

C递归算法与栈的分析,非全然二叉树遍历分析---ShinePans

             对于递归,这里面的分析最好当然是用图形的方式来分析了.这里来总结一下 1.首先对于栈的理解: 先进后出,后进先出 先进后出 2.在进行非全然二叉树的存储之后,我们要做的是对其进行遍历或者索引,查找某个孩子,或某个左孩子或右孩子的双亲,不然存了是徒劳的. 非全然二叉树的存储: 我觉得最好的存储方式是动态链表,静态链表仅仅有在某些很特殊的情况下才行得通的选择,比方说已知这个二叉树就是这样,不会再改变 而对于动态链表,我觉得最好的方式是建立5个指针,一个数据域,这五个指针各自

二叉树重建及二叉树广度优先遍历

#include <iostream> #include <queue> using namespace std; //树节点类 class TNode { public: TNode *left, *right; char value; TNode() { left = right = NULL; } TNode(char v) { left = right = NULL; value = v; } }; //根据二叉树的先序遍历和中序遍历重建二叉树 //PreOrder为二叉树

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树 1. 斜树 所有的结点都只有左子树的二叉树称为左斜树; 所有的结点都只有右子树的二叉树称为右斜树; 这两者统称为斜树 2. 满二叉树 在一

Python与数据结构[3] -&gt; 树/Tree[0] -&gt; 二叉树及遍历二叉树的 Python 实现

二叉树 / Binary Tree 二叉树是树结构的一种,但二叉树的每一个节点都最多只能有两个子节点. Binary Tree: 00 |_____ | | 00 00 |__ |__ | | | | 00 00 00 00 对于二叉树的遍历,主要有以下三种基本遍历方式: 先序遍历:先显示节点值,再显示左子树和右子树 中序遍历:先显示左子树,再显示节点值和右子树 后序遍历:先显示左子树和右子树,再显示节点值 下面将用代码构建一个二叉树,并实现三种遍历方式, 完整代码 1 class TreeNo

数据结构与算法(八)-二叉树(斜二叉树、满二叉树、完全二叉树、线索二叉树)

前言:前面了解了树的概念和基本的存储结构类型及树的分类,而在树中应用最广泛的种类是二叉树 一.简介 在树型结构中,如果每个父节点只有两个子节点,那么这样的树被称为二叉树(Binary tree).其中,一个父结点的两个字节点分别叫做“左子节点”和“右子节点”.不过也不是所有父节点都有两个子节点,只有左子节点或者只有右子节点的情况也存在.另外,也会存在叶子结点,也就是一个子节点都没有的节点,唯一的限制就是每一个节点的子节点不能超过两个. 之前谈过的单向链表,是一种通过“指向下一个元素的指针”来连接

剑指offer (19) 二叉树镜像 对称二叉树

题目: 输入一个二叉树,输出其镜像. BinTreeNode* ReverseTree(BinTreeNode* pRoot) { if (pRoot == NULL) return NULL; BinTreeNode* pLeftReverse = ReverseTree(pRoot->left); BinTreeNode* pRightReverse = ReverseTree(pRoot->right); pRoot->left = pRightReverse; pRoot->

同一棵二叉树?(二叉树)

题目描述 二叉树分别以数组存储方式创建.以先序遍历序列创建.输入二叉树的数组存储.先序遍历结果,判断根据它们创建的二叉树是否是同一棵二叉树. 输入 测试次数t 每组测试数据两行: 第一行:二叉树的数组存储(英文字母表示树结点,#表示空树) 第二行:二叉树的先序遍历结果(英文字母表示树结点,#表示空树) 输出 对每组测试数据,如果两种方式创建的是同一棵二叉树,输出YES,否则,输出NO. 样例输入 3 ABCDE ABD##E##C ABC##DE####W##F AB##CDW###E#F##

如何将一棵树转化成二叉树

要点: 从这棵树的根结点开始,从上到下,看每一个结点,把你正在看的结点的孩子放在左子树,兄弟放在右子树. 口诀: 1. 将 节点的孩子 放在左子树: 2. 将 节点的兄弟 放在右子树. 关于这个问题,最好的办法就是记住一道例题了,因为语言不是很好描述,也不容易看懂描述. 例题: 或者有另一种理解方法: 步骤: 1.在所有兄弟结点之间加一连线 2.对每个结点,除了保留与其长子的连线外,去掉该结点与其它孩子的连线. 如下图所示: ————————————————版权声明:本文为CSDN博主「猫萌萌」