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. 二叉树的堂兄弟节点的主要内容,如果未能解决你的问题,请参考以下文章