每日一道面试题-完全二叉树的判断

Posted 后台技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一道面试题-完全二叉树的判断相关的知识,希望对你有一定的参考价值。

完全二叉树的判断

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

完全二叉树

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


思路

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

  1. 一个节点没有左孩子,却有右孩子

  2. 如果一个节点只有左孩子,没有右孩子,那么之后的节点应该全部为叶节点

  3. 一个叶节点之后出现的节点只能是叶节点


代码

 
   
   
 
  1. /**

  2. * Definition for a binary tree node.

  3. * type TreeNode struct {

  4. *     Val int

  5. *     Left *TreeNode

  6. *     Right *TreeNode

  7. * }

  8. */

  9. func isCompleteTree(root *TreeNode) bool {


  10.    if root == nil {

  11.        return true

  12.    }


  13.    queue := list.New()

  14.    queue.PushFront(root)


  15.    // 标志之后的节点应当全部为叶节点

  16.    flag := false

  17.    var tem *TreeNode

  18.    for queue.Len() != 0 {

  19.        tem = queue.Back().Value.(*TreeNode)

  20.        queue.Remove(queue.Back())


  21.        if flag {

  22.            if tem.Left != nil || tem.Right != nil {

  23.                return false

  24.            }

  25.            continue

  26.        }


  27.        if tem.Left == nil && tem.Right != nil {

  28.            return false

  29.        }


  30.        // 情况2或3满足就开启flag这个过程

  31.        // 这里用异或更简洁,但是golang提示布尔值之间不允许异或

  32.        if !(tem.Left != nil && tem.Right != nil) {

  33.            flag = true

  34.        }



  35.        if tem.Left != nil {

  36.            queue.PushFront(tem.Left)

  37.        }

  38.        if tem.Right != nil {

  39.            queue.PushFront(tem.Right)

  40.        }

  41.    }


  42.    return true

  43. }


以上是关于每日一道面试题-完全二叉树的判断的主要内容,如果未能解决你的问题,请参考以下文章

每日一道面试题-完全二叉树节点个数

Java实习生每日10道面试题打卡!

Java实习生每日10道面试题打卡!

一道关于二叉树的字节面试题的思考

每日一道算法题04:重建二叉树

每日一道编程题(85):平衡二叉树