leetcode每日一题
[1738] 找出第 K 大的异或坐标值
[1744] 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
[231] 2的幂
堆排复习
[461] 汉明距离
[1190] 反转每对括号间的子串
[1707] 与数组中元素的最大异或值
[810] 黑板异或游戏
[1035] 不相交的线
[692] 前K个高频单词
[872] 叶子相似的树
[1442] 形成两个异或相等数组的三元组数目
[993] 二叉树的堂兄弟节点
[421] 数组中两个数的最大异或值
[13] 罗马数字转整数
[12] 整数转罗马数字
[1269]. 停在原地的方案数
[1310] 子数组异或查询
[1734] 解码异或后的排列
本文档使用 MrDoc 发布
-
+
首页
[993] 二叉树的堂兄弟节点
## [993] 二叉树的堂兄弟节点 [力扣原题链接](https://leetcode-cn.com/problems/cousins-in-binary-tree/) 在二叉树中,根节点位于深度 `0` 处,每个深度为 `k` 的节点的子节点位于深度 `k+1` 处。 如果二叉树的两个节点深度相同,但** 父节点不同** ,则它们是一对*堂兄弟节点* 。 我们给出了具有唯一值的二叉树的根节点 `root` ,以及树中两个不同节点的值 `x` 和 `y` 。 只有与值 `x` 和 `y` 对应的节点是堂兄弟节点时,才返回 `true` 。否则,返回 `false`。 **示例 1: ![](/media/202105/2021-05-17_105559.png)** <pre><strong>输入:</strong>root = [1,2,3,4], x = 4, y = 3 <strong>输出:</strong>false </pre> **示例 2: ![](/media/202105/2021-05-17_105559.png)** <pre><strong>输入:</strong>root = [1,2,3,null,4,null,5], x = 5, y = 4 <strong>输出:</strong>true </pre> **示例 3:** ![](/media/202105/2021-05-17_105559.png) <pre><strong>输入:</strong>root = [1,2,3,null,4], x = 2, y = 3 <strong>输出:</strong>false</pre> **提示:** * 二叉树的节点数介于 `2` 到 `100` 之间。 * 每个节点的值都是唯一的、范围为 `1` 到 `100` 的整数。 ### 题解 层序遍历树,当两个树层级相同且不是兄弟节点的情况下为堂兄弟节点。 ### 代码 ```cpp /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: bool isCousins(TreeNode* root, int x, int y) { if(root == nullptr) return false; std::deque<TreeNode*> root_list; root_list.push_back(root); int cur_list_num = (int)root_list.size(); int cur_count = 0; bool find_flag = false; while(!root_list.empty()) { if(cur_count >= cur_list_num) //进入下一层 重置数据 { cur_count = 0; cur_list_num = (int)root_list.size(); find_flag = false; } TreeNode *tmp = root_list.front(); root_list.pop_front(); cur_count ++; if(tmp->left && tmp->right && ( (tmp->left->val == x && tmp->right->val == y) || (tmp->left->val == y && tmp->right->val == x) ) ) { return false; //兄弟节点 } if(tmp->val == x || tmp->val == y) { if(find_flag) return true; //之前找到过一个 直接返回true find_flag = true; //之前未找到 标志位设置为真 //这里是因为提示给出 每个值都是唯一的,否则需要将find_flag改为已找到的值并判断下一个找到的值是否重复 } if(tmp->left != nullptr) root_list.push_back(tmp->left); if(tmp->right != nullptr) root_list.push_back(tmp->right); } return false; } }; ```
ty
2021年5月17日 10:58
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
阅读量
次
本站总访问量
次
本站访客数
人次
Markdown文件
分享
链接
类型
密码
更新密码