993. 二叉树的堂兄弟节点

Posted lgz0921

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了993. 二叉树的堂兄弟节点相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/cousins-in-binary-tree/

思路:层序遍历,遍历过程中需要记录这一层有多少节点(方便后边遍历一层),每次遍历一层的节点。遍历过程中判断两个节点是不是一个父亲(是同一个父亲直接返回false即可),同时用map标记两个节点的层数。只要有一个节点被标记过,就可以结束循环,因为如果在一层那么必然都有值而且值相等就是true,如果不是在一层就是一个是有值的,另一个的值就是null,判断结果就是false(这里的值,指得是map中的value,value标记的是层数,如果key没有放过的话,访问这个key的value得到的就是null)。

上代码:

/**
 * Example:
 * var ti = TreeNode(5)
 * var v = ti.`val`
 * Definition for a binary tree node.
 * class TreeNode(var `val`: Int) {
 *     var left: TreeNode? = null
 *     var right: TreeNode? = null
 * }
 */
class Solution {
    fun isCousins(root: TreeNode?, x: Int, y: Int): Boolean {
        val queue = LinkedList<TreeNode>()
        val map = HashMap<Int, Int>()
        var count = 1
        var level = 1
        queue.add(root!!)
        while (queue.isNotEmpty()) {
            var cnt = count
            count = 0
            while (cnt > 0) {
                val now = queue.poll()
                cnt--
                if (now.right?.`val` == x && now.left?.`val` == y || now.right?.`val` == y && now.left?.`val` == x) {
                    return false
                }
                when (now.`val`) {
                    x -> map[x] = level
                    y -> map[y] = level
                }
                now.left?.let {
                    queue.add(it)
                    count++
                }
                now.right?.let {
                    queue.add(it)
                    count++
                }
            }
            if (map.containsKey(x) || map.containsKey(y)) {
                break
            }
            level++
        }
        if (map[x] == map[y]) {
            return true
        }
        return false
    }
}

 

以上是关于993. 二叉树的堂兄弟节点的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《二叉树》简单07 —— LeetCode 993. 二叉树的堂兄弟节点

力扣每日一题:993. 二叉树的堂兄弟节点(简单)

993. 二叉树的堂兄弟节点

leetcode 993. 二叉树的堂兄弟节点

993. 二叉树的堂兄弟节点

993. 二叉树的堂兄弟节点