【題目】993. 二叉樹的堂兄弟節點
在二叉樹中,根節點位於深度 0 處,每個深度爲 k 的節點的子節點位於深度 k+1 處。
如果二叉樹的兩個節點深度相同,但父節點不同,則它們是一對堂兄弟節點。
我們給出了具有唯一值的二叉樹的根節點 root,以及樹中兩個不同節點的值 x 和 y。
只有與值 x 和 y 對應的節點是堂兄弟節點時,才返回 true。否則,返回 false。
示例 1:
輸入:root = [1,2,3,4], x = 4, y = 3
輸出:false
示例 2:
輸入:root = [1,2,3,null,4,null,5], x = 5, y = 4
輸出:true
示例 3:
輸入:root = [1,2,3,null,4], x = 2, y = 3
輸出:false
提示:
二叉樹的節點數介於 2 到 100 之間。
每個節點的值都是唯一的、範圍爲 1 到 100 的整數。
【解題思路1】Map
當且僅當一對節點深度相同而父節點不相同時,它們是堂兄弟節點。
用dfs標記每一個節點,對於每一個節點 node,它的父親爲 par,深度爲 d,都記錄到 Hashmap 中:parent[node.val] = par 且 depth[node.val] = d。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<Integer, Integer> depth;
Map<Integer, TreeNode> parent;
public boolean isCousins(TreeNode root, int x, int y) {
depth = new HashMap();
parent = new HashMap();
dfs(root, null);
return (depth.get(x) == depth.get(y) && parent.get(x) != parent.get(y));
}
public void dfs(TreeNode node, TreeNode par) {
if (node != null) {
depth.put(node.val, par != null ? 1 + depth.get(par.val) : 0);
parent.put(node.val, par);
dfs(node.left, node);
dfs(node.right, node);
}
}
}