C++写一个二叉树类,包括建立、插入、查询、输出
时间: 2023-09-05 07:05:18 浏览: 76
### 回答1:
以下是一个简单的二叉树类的实现,包括了建立、插入、查询、输出:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
typedef struct BinaryTree {
TreeNode *root;
} BinaryTree;
TreeNode *createNode(int data) {
TreeNode *newNode = (TreeNode *)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void insert(BinaryTree *bt, int data) {
TreeNode *newNode = createNode(data);
if (bt->root == NULL) {
bt->root = newNode;
return;
}
TreeNode *current = bt->root;
while (1) {
if (data < current->data) {
if (current->left == NULL) {
current->left = newNode;
return;
}
current = current->left;
} else {
if (current->right == NULL) {
current->right = newNode;
return;
}
current = current->right;
}
}
}
TreeNode *search(TreeNode *node, int data) {
if (node == NULL || node->data == data) {
return node;
}
if (data < node->data) {
return search(node->left, data);
} else {
return search(node->right, data);
}
}
void inorderTraversal(TreeNode *node) {
if (node == NULL) {
return;
}
inorderTraversal(node->left);
printf("%d ", node->data);
inorderTraversal(node->right);
}
void preorderTraversal(TreeNode *node) {
if (node == NULL) {
return;
}
printf("%d ", node->data);
preorderTraversal(node->left);
preorderTraversal(node->right);
}
void postorderTraversal(TreeNode *node) {
if (node == NULL) {
return;
}
postorderTraversal(node->left);
postorderTraversal(node->right);
printf("%d ", node->data);
}
int main() {
BinaryTree bt = {NULL};
insert(&bt, 50);
insert(&bt, 30);
insert(&bt, 70);
insert(&bt, 20);
insert(&bt, 40);
insert(&bt, 60);
insert(&bt, 80);
printf("Inorder traversal: ");
inorderTraversal(bt.root);
printf("\n");
printf("Preorder traversal: ");
preorderTraversal(bt.root);
printf("\n");
printf("Postorder traversal: ");
postorderTraversal(bt.root);
printf("\n");
TreeNode *found = search(bt.root, 60);
if (found == NULL) {
printf("Element not found\n");
} else {
printf("Element found: %d\n", found->data);
}
return 0;
}
```
在这个示例中,我们首先定义了一个 `TreeNode` 结构体,用于表示二叉树中的一个节点。每个节点包含一个整数数据,以及两个指向左右子节点的指针。接下来,我们定义了一个 `BinaryTree` 结构体,它包含一个指向树根节点的指针。这个结构体用于表示整个二叉树。
我们实现了一个 `createNode` 函数,用于创建一个新的节点,并将数据和左右子节点指针初始化为NULL。接下来,我们实现了 `insert` 函数,用于将新的节点插入到二叉树中。这个函数首先创建一个新的节点,然后遍历二叉树,找到新节点应该放置的位置。最后,我们实现了一个 `search` 函数,用于在二叉树中搜索指定的元素。
最后,我们实现了三个不同的遍历函数:`inorderTraversal`、`preorderTraversal` 和 `postorderTraversal`。它们分别实现了中序遍历、先序遍历和后序遍历。这些遍历函数都是递归实现的。
在主函数中,我们创建了一个新的空二叉树,并向其中插入一些元素。然后,我们分别使用这三个遍历函数输出二叉树中的所有元素。最后,我们使用 `search` 函数搜索指定的元素,并输出结果。
### 回答2:
二叉树是一种常见的数据结构,其每个节点最多有两个子节点,分别称为左子节点和右子节点。下面是一个用C语言实现的简单二叉树类:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树节点结构
typedef struct TreeNode {
int data; // 节点数据
struct TreeNode* left; // 左子节点指针
struct TreeNode* right; // 右子节点指针
} TreeNode;
// 初始化二叉树
void initTree(TreeNode** root) {
*root = NULL;
}
// 创建新节点
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
// 插入节点
void insert(TreeNode** root, int data) {
if (*root == NULL) {
*root = createNode(data);
return;
}
// 比较节点大小确定插入位置
if (data < (*root)->data) {
insert(&((*root)->left), data);
} else {
insert(&((*root)->right), data);
}
}
// 查询节点
TreeNode* search(TreeNode* root, int data) {
if (root == NULL || root->data == data) {
return root;
}
if (data < root->data) {
return search(root->left, data);
}
return search(root->right, data);
}
// 输出节点
void printTree(TreeNode* root) {
if (root != NULL) {
printf("%d ", root->data);
printTree(root->left);
printTree(root->right);
}
}
int main() {
TreeNode* root;
initTree(&root);
insert(&root, 5);
insert(&root, 3);
insert(&root, 8);
insert(&root, 1);
insert(&root, 4);
insert(&root, 7);
insert(&root, 9);
printf("二叉树的前序遍历结果: ");
printTree(root);
TreeNode* targetNode = search(root, 4);
if (targetNode != NULL) {
printf("\n找到节点: %d\n", targetNode->data);
} else {
printf("\n未找到节点\n");
}
return 0;
}
```
上述代码实现了一个二叉树的基本操作,包括初始化、插入、查询和输出。通过main函数的调用示例,我们可以建立一棵二叉树,并使用前序遍历输出树中的节点。在这个示例中,树中的节点数据类型是整数,但实际上可以根据需求而定。
### 回答3:
二叉树是一种常用的数据结构,可以用来存储和操作有序数据。下面是一个简单的二叉树类的实现,包括建立、插入、查询和输出功能。
首先是建立二叉树的方法:
```
class TreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class BinaryTree:
def __init__(self, root_value):
self.root = TreeNode(root_value)
def insert(self, value):
# 从根节点开始遍历,找到合适的位置插入新节点
node = self.root
while True:
if value < node.value:
if node.left is None:
node.left = TreeNode(value)
break
else:
node = node.left
else:
if node.right is None:
node.right = TreeNode(value)
break
else:
node = node.right
def search(self, value):
# 从根节点开始遍历,寻找目标值
node = self.root
while node is not None and node.value != value:
if value < node.value:
node = node.left
else:
node = node.right
return node
def inorder_traversal(self, node):
# 中序遍历二叉树,将结果输出到一个列表中
result = []
if node is not None:
result.extend(self.inorder_traversal(node.left))
result.append(node.value)
result.extend(self.inorder_traversal(node.right))
return result
def print_tree(self):
# 输出二叉树的所有节点值
result = self.inorder_traversal(self.root)
print(result)
```
使用上述二叉树类可以实现建立、插入、查询和输出功能,例如:
```
tree = BinaryTree(5)
tree.insert(3)
tree.insert(8)
tree.insert(2)
tree.insert(4)
tree.insert(7)
tree.insert(9)
tree.print_tree() # 输出:[2, 3, 4, 5, 7, 8, 9]
node = tree.search(4)
print(node.value) # 输出:4
```
这个二叉树类使用节点和链接来表示二叉树的结构。在建立二叉树时,首先创建一个根节点,然后通过插入节点的方式逐步建立完整的二叉树。查询操作则是从根节点开始,根据目标值比较大小,逐步向下遍历直到找到目标节点或者遍历到叶子节点。最后,通过中序遍历方法输出二叉树的所有节点值。
阅读全文