完全二叉树的判断

完全二叉树的判断

各种二叉树的判断是经常出现的题目,这里给出的是完全二叉树的判断。

完全二叉树

第一次看到概念觉得很晦涩,但是结合图一下就知道是不是一棵完全二叉树。不知道的完全二叉树的同学先自行搜索相关概念。

思路

既然树的题目逃不过遍历,那么在四种遍历挑选一种同学们觉得哪种遍历能够解决问题,直觉告诉我就是层次遍历,不要说这是瞎扯,结合完全二叉树的概念,很明显先中后序没有办法完成,那就用层次遍历试试吧。
这不是递归,没有办法去描述递归公式,但是怎么描述一棵树是完全二叉树呢,似乎不好描述,那么就用正反结合来论述吧,情况如下:

  1. 一个节点没有左孩子,却有右孩子
  2. 如果一个节点只有左孩子,没有右孩子,那么之后的节点应该全部为叶节点
  3. 一个叶节点之后出现的节点只能是叶节点

代码

/**
 * 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。微信公众号:后台技术栈。
image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值