993.二叉树的堂兄弟节点
链接:993.二叉树的堂兄弟节点
难度:Easy
标签:树、深度优先搜索、广度优先搜索、二叉树
简介:如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
题解 1 - typescript
- 编辑时间:2021-07-25
- 执行用时:72ms
- 内存消耗:39.6MB
- 编程语言:typescript
- 解法介绍:dfs。
function isCousins(root: TreeNode | null, x: number, y: number): boolean {
const map = new Map<number, { parent: TreeNode | null; level: number }>();
dfs();
const xNode = map.get(x)!;
const yNode = map.get(y)!;
return xNode.level === yNode.level && xNode.parent !== yNode.parent;
function dfs(node: TreeNode | null = root, level = 0, parent: TreeNode | null = null) {
if (node === null) return;
map.set(node.val, {
parent,
level,
});
dfs(node.left, level + 1, node);
dfs(node.right, level + 1, node);
}
}
题解 2 - python
- 编辑时间:2024-02-08
- 执行用时:41ms
- 内存消耗:16.5MB
- 编程语言:python
- 解法介绍:遍历记录父亲和level。
class Solution:
def isCousins(self, root: Optional[TreeNode], x: int, y: int) -> bool:
map = {}
xlevel = ylevel = 0
xnode, ynode = None, None
def dfs(node: Optional[TreeNode], level = 0):
nonlocal xnode, ynode, xlevel, ylevel
if not node: return
if node.val == x:
xnode = node
xlevel = level
if node.val == y:
ynode = node
ylevel = level
if node.left:
map[node.left] = node
dfs(node.left, level + 1)
if node.right:
map[node.right] = node
dfs(node.right, level + 1)
dfs(root)
if xlevel != ylevel: return False
if map[xnode] == map[ynode]: return False
return True
题解 3 - typescript
- 编辑时间:2021-05-17
- 执行用时:116ms
- 内存消耗:39.3MB
- 编程语言:typescript
- 解法介绍:生成节点的继承链进行比较。
function isCousins(root: TreeNode | null, x: number, y: number): boolean {
if (root === null) return false;
const findGrandParent = (
val: number,
queue: TreeNode[],
node: TreeNode | null = root
): boolean => {
if (node === null) return false;
queue.unshift(node);
if (node.val === val) return true;
if (findGrandParent(val, queue, node.left)) return true;
if (findGrandParent(val, queue, node.right)) return true;
queue.shift();
return false;
};
const queueX: TreeNode[] = [];
findGrandParent(x, queueX);
const queueY: TreeNode[] = [];
findGrandParent(y, queueY);
if (queueX.length < 3 || queueY.length < 3) return false;
return queueX[1] !== queueY[1] && queueX.length === queueY.length;
}