c++ 二叉树查找指定结点的双亲和兄弟
时间: 2023-08-06 11:05:55 浏览: 109
输出二叉树中某结点的双亲结点
5星 · 资源好评率100%
假设我们已经有了一个二叉树的结构体定义如下:
```c++
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode* parent;
TreeNode(int x) : val(x), left(NULL), right(NULL), parent(NULL) {}
};
```
其中,`val` 表示节点的值,`left` 表示左子节点,`right` 表示右子节点,`parent` 表示父节点。
查找指定节点的双亲节点可以通过遍历整个二叉树,找到该节点的父节点,时间复杂度为 O(n)。代码如下:
```c++
TreeNode* findParent(TreeNode* root, TreeNode* node) {
if (root == NULL || root == node) {
return NULL;
}
if (root->left == node || root->right == node) {
return root;
}
TreeNode* parent = findParent(root->left, node);
if (parent == NULL) {
parent = findParent(root->right, node);
}
return parent;
}
```
查找指定节点的兄弟节点也需要先找到该节点的父节点,然后在父节点的左右子树中查找兄弟节点。代码如下:
```c++
TreeNode* findSibling(TreeNode* root, TreeNode* node) {
TreeNode* parent = findParent(root, node);
if (parent == NULL) {
return NULL;
}
if (parent->left == node) {
return parent->right;
} else {
return parent->left;
}
}
```
以上代码中,`findParent` 和 `findSibling` 都是递归实现的,时间复杂度都为 O(n)。如果二叉树不是平衡二叉树,最坏情况下时间复杂度可能达到 O(n^2)。可以考虑使用非递归的方式实现,可以使用栈来辅助实现。
阅读全文