完全二叉树的判断
各种二叉树的判断是经常出现的题目,这里给出的是完全二叉树的判断。
完全二叉树
第一次看到概念觉得很晦涩,但是结合图一下就知道是不是一棵完全二叉树。不知道的完全二叉树的同学先自行搜索相关概念。
思路
既然树的题目逃不过遍历,那么在四种遍历挑选一种同学们觉得哪种遍历能够解决问题,直觉告诉我就是层次遍历,不要说这是瞎扯,结合完全二叉树的概念,很明显先中后序没有办法完成,那就用层次遍历试试吧。
这不是递归,没有办法去描述递归公式,但是怎么描述一棵树是完全二叉树呢,似乎不好描述,那么就用正反结合来论述吧,情况如下:
- 一个节点没有左孩子,却有右孩子
- 如果一个节点只有左孩子,没有右孩子,那么之后的节点应该全部为叶节点
- 一个叶节点之后出现的节点只能是叶节点
代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isCompleteTree(root *TreeNode) bool {
if root == nil {
return true
}
queue := list.New()
queue.PushFront(root)
// 标志之后的节点应当全部为叶节点
flag := false
var tem *TreeNode
for queue.Len() != 0 {
tem = queue.Back().Value.(*TreeNode)
queue.Remove(queue.Back())
if flag {
if tem.Left != nil || tem.Right != nil {
return false
}
continue
}
if tem.Left == nil && tem.Right != nil {
return false
}
// 情况2或3满足就开启flag这个过程
// 这里用异或更简洁,但是golang提示布尔值之间不允许异或
if !(tem.Left != nil && tem.Right != nil) {
flag = true
}
if tem.Left != nil {
queue.PushFront(tem.Left)
}
if tem.Right != nil {
queue.PushFront(tem.Right)
}
}
return true
}
关于作者
大四学生一枚,分析数据结构,面试题,golang,C语言等知识。QQ交流群:521625004。微信公众号:后台技术栈。