判断两个节点指针是否为堂兄弟
时间: 2023-08-21 17:03:34 浏览: 38
好的,下面是用C++实现判断两个节点指针是否为堂兄弟的函数:
```c++
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode *parent;
TreeNode(int x) : val(x), left(NULL), right(NULL), parent(NULL) {}
};
bool isCousin(TreeNode* root, TreeNode* a, TreeNode* b) {
if (!root || !a || !b) {
return false;
}
if (a->parent == b->parent) {
return false;
}
if (a->parent == b || b->parent == a) {
return false;
}
return depth(root, a) == depth(root, b);
}
int depth(TreeNode* root, TreeNode* node) {
if (!root) {
return 0;
}
if (root == node) {
return 1;
}
int left_depth = depth(root->left, node);
int right_depth = depth(root->right, node);
if (left_depth > 0) {
return left_depth + 1;
}
if (right_depth > 0) {
return right_depth + 1;
}
return 0;
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->right->right = new TreeNode(5);
root->left->left->parent = root->left;
root->right->right->parent = root->right;
TreeNode* a = root->left->left;
TreeNode* b = root->right->right;
cout << isCousin(root, a, b) << endl; // 输出1,表示a和b是堂兄弟
return 0;
}
```
在该函数中,我们首先判断a和b的父节点是否相同,如果相同,则a和b不可能为堂兄弟,直接返回false。然后再判断a的父节点是否为b,或者b的父节点是否为a,如果是的话,则a和b不是堂兄弟,直接返回false。最后,利用depth函数判断a和b的深度是否相同,如果相同,则a和b为堂兄弟,返回true。