leetcode 993. 二叉樹的堂兄弟節點

【題目】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);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章