/** * 993. Cousins in Binary Tree * https://leetcode.com/problems/cousins-in-binary-tree/description/ * two nodes in the binary tree are the cousins if they have same depth,but have different parents. */ import java.util.* class TreeNode(var `val`: Int) { var left: TreeNode? = null var right: TreeNode? = null } class Solution { fun isCousins(root: TreeNode?, x: Int, y: Int): Boolean? { //if have same depth and is not sibling, they are cousins return getDepth(root, x) == getDepth(root, y) && !isSibling(root, x, y) } fun getDepth(root: TreeNode?, value: Int): Int { val queue = LinkedList<TreeNode>() var depth = 0 queue.offer(root) while (queue.size > 0) { depth++ val size = queue.size for (i in size - 1 downTo 0) { val node = queue.poll() if (node.`val` == value) { return depth } if (node.left != null) { queue.offer(node.left) } if (node.right != null) { queue.offer(node.right) } } } return -1 } /** * 判断x和y在root中是否为兄弟 * */ fun isSibling(root: TreeNode?, x: Int, y: Int): Boolean { val queue = LinkedList<TreeNode>() var depth = 0 queue.offer(root) while (queue.size > 0) { depth++ val size = queue.size for (i in size - 1 downTo 0) { val node = queue.poll() if (node.left != null && node.right != null) { if (node.left!!.`val` == x && node.right!!.`val` == y || node.right!!.`val` == x && node.left!!.`val` == y ) { return true } } if (node.left != null) { queue.offer(node.left) } if (node.right != null) { queue.offer(node.right) } } } return false } }