在二叉树中,根节点位于深度 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 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 unordered_map<int, std::pair<int, TreeNode*>> hashMap; // key->节点值, value->(深度,父节点) 15 bool isCousins(TreeNode* root, int x, int y) { 16 if (root == nullptr) { 17 return false; 18 } 19 queue<TreeNode *> q; 20 q.push(root); 21 hashMap[root->val].first = 0; 22 hashMap[root->val].second = root; 23 int step = 0; 24 while (!q.empty()) { 25 int size = q.size(); 26 step++; 27 for (int i = 0; i < size; i++) { 28 TreeNode *curNode = q.front(); 29 q.pop(); 30 if (curNode == nullptr) { 31 continue; 32 } 33 if (curNode->left != nullptr) { 34 q.push(curNode->left); 35 hashMap[curNode->left->val].first = step; 36 hashMap[curNode->left->val].second = curNode; 37 } 38 if (curNode->right != nullptr) { 39 q.push(curNode->right); 40 hashMap[curNode->right->val].first = step; 41 hashMap[curNode->right->val].second = curNode; 42 } 43 } 44 } 45 auto xInfo = hashMap.find(x); 46 auto yInfo = hashMap.find(y); 47 // x或者y的深度和父节点不存在,则返回false 48 if (xInfo == hashMap.end() || yInfo == hashMap.end()) { 49 return false; 50 } 51 // 只有x和y的深度、父节点均存在,且x和y深度相同,x和y的父节点不同时才返回true 52 if (xInfo->second.first == yInfo->second.first && 53 xInfo->second.second != yInfo->second.second) { 54 return true; 55 } 56 return false; 57 } 58 };