二叉树系列五:判断二叉树是否为完全二叉树
2017-10-19 21:23
267 查看
满二叉树的定义如下:一个深度为k,结点个数为2^k-1的二叉树为满二叉树;完全二叉树的定义如下:二叉树只有最下层和次下层存在叶子结点,并且最下层的叶子结点只能集中在该层最左边的位置,显然,满二叉树也是完全二叉树。
那该如何判断一棵二叉树是否为完全二叉树呢?任意一棵二叉树,我们可以将它补成满二叉树,这样,没有结点的地方都为null。在层次遍历的时候,如果是完全二叉树,这些null结点一定在层次遍历的末尾,所以,当遍历至null的时候,二叉树的遍历已经完成;但是,如果这棵树不是完全二叉树,当我们遍历到null的时候,会发现null之后还有一些未被遍历的值。因此,我们可以先将二叉树补成满二叉树,在进行层次遍历,从而判定是否为完全二叉树。
以下是C++实现的源代码:
那该如何判断一棵二叉树是否为完全二叉树呢?任意一棵二叉树,我们可以将它补成满二叉树,这样,没有结点的地方都为null。在层次遍历的时候,如果是完全二叉树,这些null结点一定在层次遍历的末尾,所以,当遍历至null的时候,二叉树的遍历已经完成;但是,如果这棵树不是完全二叉树,当我们遍历到null的时候,会发现null之后还有一些未被遍历的值。因此,我们可以先将二叉树补成满二叉树,在进行层次遍历,从而判定是否为完全二叉树。
以下是C++实现的源代码:
bool JudgeCompleteBiTree(BiTree root) { if(root == NULL) return true; deque<BiTree> d; d.push_back(root); BiTree temp = root; //将二叉树补成满二叉树 while(temp) { d.push_back(temp->Lchild); d.push_back(temp->Rchild); temp = d.front(); d.pop_front(); } //判断当前剩余的结点中是否存在非null结点 while(d.size()) { temp = d.front(); if(temp != NULL) return false; d.pop_front(); } return true; }
相关文章推荐
- 二叉树系列问题——判断一棵树是否为完全二叉树
- 判断一个二叉树是否是完全二叉树
- 判断一棵二叉树是否为完全二叉树
- 二叉树问题---判断一棵树是否为完全二叉树
- 判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
- 判断一棵二叉树是否是完全二叉树的方法
- 判断一个二叉树是否是完全二叉树
- 二叉树(二) 求二叉树高度,根据先序和中序构建二叉树,判断二叉树是否是完全二叉树,判断两棵树是否相等
- 数据结构——判断二叉树是否为完全二叉树
- 二叉树采用二叉链表存储,设计算法判断给定的二叉树是否是一棵完全二叉树,采用先进先出的队列。
- 判断二叉树是否为完全二叉树
- 判断二叉树是否是搜索二叉树和完全二叉树
- 判断二叉树是否为完全二叉树
- 判断一棵二叉树是否是完全二叉树
- 8-32 判断一棵二叉树是否是完全二叉树
- 【二叉树】层次遍历二叉树以及判断一棵树是否是完全二叉树
- 判断一棵二叉树是否是完全二叉树
- 二叉树系列四:Leetcode#98判断二叉树是否为二叉搜索树(BST)
- 判断一棵二叉树是否为完全二叉树
- 判断二叉树是否平衡、是否完全二叉树、是否二叉排序树