1. 二叉树的基本原理
1.1 结构定义
二叉树是由节点组成的层级结构,每个节点最多有两个子节点:左子节点和右子节点。节点之间的关系可以用以下的结构定义表示:
struct TreeNode {
int data; // 节点的数据
struct TreeNode* left; // 左子节点指针
struct TreeNode* right; // 右子节点指针
};
1.2 二叉树的分类
根据节点的子节点个数,二叉树可分为:满二叉树、完全二叉树、平衡二叉树等。这些分类决定了二叉树在不同场景下的应用和性能。
2. 二叉树的分支结构
2.1 递归遍历
二叉树的遍历包括前序遍历、中序遍历和后序遍历。递归是实现这些遍历的一种简洁而直观的方法。
void preOrderTraversal(struct TreeNode* root) {
if (root != NULL) {
printf("%d ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
}
2.2 非递归遍历
使用栈结构可以实现二叉树的非递归遍历。例如,中序遍历的非递归实现如下:
void inOrderTraversal(struct TreeNode* root) {
struct TreeNode* current = root;
struct Stack* stack = createStack();
while (current != NULL || !isEmpty(stack)) {
while (current != NULL) {
push(stack, current);
current = current->left;
}
current = pop(stack);
printf("%d ", current->data);
current = current->right;
}
destroyStack(stack);
}
3. 二叉树的复杂度
3.1 时间复杂度
二叉树的遍历和搜索操作的时间复杂度通常为O(n),其中n是二叉树的节点数。但在特定情况下,如平衡二叉搜索树(AVL树),可以达到O(logn)的时间复杂度。
3.2 空间复杂度
递归遍历二叉树的空间复杂度为O(h),其中h是二叉树的高度。非递归遍历通常使用栈,空间复杂度也为O(h)。
4. 示例代码
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
// 递归前序遍历
void preOrderTraversal(struct TreeNode* root) {
if (root != NULL) {
printf("%d ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
}
// 非递归中序遍历
void inOrderTraversal(struct TreeNode* root) {
struct TreeNode* current = root;
struct Stack* stack = createStack();
while (current != NULL || !isEmpty(stack)) {
while (current != NULL) {
push(stack, current);
current = current->left;
}
current = pop(stack);
printf("%d ", current->data);
current = current->right;
}
destroyStack(stack);
}
int main() {
// 构建二叉树示例
struct TreeNode* root = createSampleTree();
// 遍历二叉树
printf("Preorder Traversal: ");
preOrderTraversal(root);
printf("\nInorder Traversal: ");
inOrderTraversal(root);
return 0;
}