c++树的基本操作,包括存储,遍历,查找双亲,孩子操作等,给出完整代码
时间: 2024-10-11 15:03:49 浏览: 43
在 C++ 中,二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,它用于快速查找、插入和删除元素。下面是一些基本操作的示例,包括存储(创建节点)、遍历(前序、中序和后序)、查找双亲以及添加和删除节点。
首先,我们定义一个二叉搜索树节点:
```cpp
#include <iostream>
class Node {
public:
int data;
Node* left;
Node* right;
Node(int value) {
data = value;
left = nullptr;
right = nullptr;
}
};
```
### 存储操作:
- 插入:
```cpp
Node* insert(Node* root, int value) {
if (root == nullptr) {
return new Node(value);
}
if (value < root->data) {
root->left = insert(root->left, value);
} else if (value > root->data) {
root->right = insert(root->right, value);
}
return root;
}
```
- 删除:
```cpp
Node* remove(Node* root, int value) {
if (root == nullptr) {
return root;
}
if (value < root->data) {
root->left = remove(root->left, value);
} else if (value > root->data) {
root->right = remove(root->right, value);
} else {
// 找到要删除的节点
if (root->left == nullptr && root->right == nullptr) { // 没有子节点
delete root;
root = nullptr;
} else if (root->left == nullptr) { // 只有右子节点
Node* temp = root;
root = root->right;
delete temp;
} else if (root->right == nullptr) { // 只有左子节点
Node* temp = root;
root = root->left;
delete temp;
} else { // 有两个子节点
Node* min_node = find_min(root->right);
root->data = min_node->data; // 更新根节点值
root->right = remove(root->right, min_node->data); // 从右子树删除最小节点
}
}
return root;
}
Node* find_min(Node* node) {
while (node->left != nullptr) {
node = node->left;
}
return node;
}
```
### 遍历操作:
- 前序遍历:
```cpp
void preOrder(Node* root) {
if (root != nullptr) {
std::cout << root->data << " ";
preOrder(root->left);
preOrder(root->right);
}
}
```
- 中序遍历:
```cpp
void inOrder(Node* root) {
if (root != nullptr) {
inOrder(root->left);
std::cout << root->data << " ";
inOrder(root->right);
}
}
```
- 后序遍历:
```cpp
void postOrder(Node* root) {
if (root != nullptr) {
postOrder(root->left);
postOrder(root->right);
std::cout << root->data << " ";
}
}
```
### 查找双亲操作:
由于BST的特性,每个节点的左子树所有节点小于该节点,右子树所有节点大于该节点。因此,查找某个节点的双亲可以通过比较目标值和当前节点值判断是在左边还是右边。
```cpp
Node* findParent(Node* root, int value) {
if (root == nullptr || root->data == value) {
return nullptr;
}
if (value < root->data) {
return findParent(root->left, value);
} else {
return findParent(root->right, value);
}
}
```
以上代码并未包含查找操作,因为BST的查找操作已经内置在其插入和删除算法中。你可以通过访问 `root` 来找到特定值是否存在。
阅读全文