题目来源
题目概述
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。
思路分析
可以使用层序遍历或者dfs方式及遍历树。
代码实现
java实现
public class Solution {
public boolean isCousins(TreeNode root, int x, int y) {
if (root.val == x || root.val == y) {
return false;
}
Queue<TreeNode> parentQueue = new LinkedList<>();
parentQueue.add(root);
Queue<TreeNode> sonQueue = new LinkedList<>();
boolean continueFlag = true;
do {
while (!parentQueue.isEmpty()) {
TreeNode current = parentQueue.poll();
if ((current.left != null && (current.left.val == x || current.left.val == y)) ||
(current.right != null && (current.right.val == x || current.right.val == y))) {
if (!continueFlag) {
return true;
}
continueFlag = false;
}
if (current.left != null) {
sonQueue.add(current.left);
}
if (current.right != null) {
sonQueue.add(current.right);
}
}
Queue<TreeNode> temp = parentQueue;
parentQueue = sonQueue;
sonQueue = temp;
}while (continueFlag);
return false;
}
c++实现
class Solution {
public:
bool isCousins(TreeNode* root, int x, int y) {
if (root->val == x || root->val == y) {
return false;
}
vector<TreeNode*> parent_queue = {root};
vector<TreeNode*> son_queue;
bool continue_flag = true;
do {
for(TreeNode* current : parent_queue){
if ((current->left != nullptr && (current->left->val == x || current->left->val == y)) ||
(current->right != nullptr && (current->right->val == x || current->right->val == y))) {
if (!continue_flag) {
return true;
}
continue_flag = false;
}
if (current->left != nullptr) {
son_queue.push_back(current->left);
}
if (current->right != nullptr) {
son_queue.push_back(current->right);
}
}
vector<TreeNode*> temp = parent_queue;
parent_queue = son_queue;
son_queue = temp;
} while (continue_flag);
return false;
}
}
算法题记录