/***/二叉树经典面试题之判断一棵二叉树是否是完全二叉树
来源:互联网 发布:南天软件待遇 编辑:程序博客网 时间:2024/06/05 15:36
什么是完全二叉树呢
如果一颗二叉树的只有最后两层结点的度能小于2,其余结点的度都等于2。且最后一层的结点从最左边依次排列。 如果一颗二叉树中的每一个结点都与编号从1到n的满二叉树中的结点一一对应,则称这棵二叉树为完全二叉树。
我们可以根据完全二叉树的定义,按照层序遍历一颗树,当遇到空结点时如果这棵树已经遍历完毕,则这棵树就是完全二叉树,如果遇到空结点的后面还有元素则这棵树就不是完全二叉树。
我们可以用一个flag来标记,当遇到第一个空结点是标记为1,如果后面要是再遇到非空结点时就表示不是完全二叉树。
bool IsCompleteBinaryTree(BinaryTreeNode<int>* root) //判断一颗二叉树是否是完全二叉树 { if (root == NULL) return false; queue<BinaryTreeNode<int>*> q; int flag = 0; q.push(root); while (!q.empty()) { BinaryTreeNode<int>* cur = q.front(); q.pop(); if (cur->_left) { if (flag) return false; q.push(cur->_left); } else { if (flag == 0) flag = 1; } if (cur->_right) { if (flag) return false; q.push(cur->_right); } else { if (flag == 0) flag = 1; } } return true; }
判断一棵树是否为完全二叉树,首先要理解完全二叉树的定义,完全二叉树就是 只有最下面的两层结点度能够小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。
1)所以根据特点,我们可以思考,如果对于完全二叉树,我们进行层序遍历,那么一直就可以走到头,而对于非完全二叉树,我们进行层序遍历,那么我们可能还会遇到空。因为最后一层节点的分布导致。
所以我们就可以利用层序遍历进行判断,先把每层的节点进行入队。然后出队,一直到碰到NULL,这个时候看队中是否还剩下了非空结点,如果存在,那么就不是完全二叉树。如果不存在,那么就是完全二叉树。
2)可以给一个flag,当到左树的时候,利用这个flag,如果左为空,右边还右节点,那么这棵树必定不是完全二叉树。
3)也还可以从上利用队列,放入队列当中,当遇到一个空节点后不再入队,然后向后看是否还有非空节点,有则不是完全二叉树,没有则是完全二叉树。
bool IsComplateBinaryTree() { std::queue<Node * > q; Node* cur = _root; q.push(cur); //首先进行层序,把每一层的节点都入队,这个时候不存在的节点就按照NULL入队 while ((cur = q.front()) != NULL) { q.pop(); q.push(cur->_left); q.push(cur->_right); } //这个时候如果是完全二叉树,那么队中就全部为空,如果为非完全二叉树的话,那么队中就会存在不为空的元素。 while (!q.empty()) { cur = q.front(); q.pop(); if (cur != NULL) { return false; } } return true;
0 0
- /***/二叉树经典面试题之判断一棵二叉树是否是完全二叉树
- 【面试题】判断一棵二叉树是否是完全二叉树
- 二叉树经典面试题4~判断一棵树是否是完全二叉树
- 二叉树经典面试题4~判断一棵树是否是完全二叉树
- 数据结构面试题/判断一棵树是否是完全二叉树
- 判断一棵二叉树是否是完全二叉树
- 判断一棵二叉树是否是完全二叉树
- 数据结构面试题/判断一棵二叉树是否是平衡二叉树
- 判断一颗二叉树是否是完全二叉树
- 判断一颗二叉树是否是完全二叉树
- 判断一棵二叉树是否为完全二叉树
- 判断一棵二叉树是否为完全二叉树
- 判断一棵二叉树是否为完全二叉树
- 如何判断一棵二叉树是完全二叉树
- 如何判断一棵二叉树是完全二叉树
- 如何判断一棵二叉树是完全二叉树
- 如何判断一棵二叉树是完全二叉树
- 如何判断一棵二叉树是完全二叉树
- Java多线程系列--“JUC集合”08之 LinkedBlockingQueue
- AsyncTask(异步)和Thread(线程)的使用与对比
- Oracle笔记(九) 表的创建及管理
- 一些Java面试题
- 深度学习
- /***/二叉树经典面试题之判断一棵二叉树是否是完全二叉树
- Java多线程系列--“JUC集合”09之 LinkedBlockingDeque
- Kaggle入门
- 修改mysql自增字段的方法
- Oracle笔记(十) 约束
- django模板中插入summernote工具(bootstraphtml编辑器)
- PHPCMS手机站伪静态设置详细教程
- 欢迎使用CSDN-markdown编辑器
- Java多线程系列--“JUC集合”10之 ConcurrentLinkedQueue