数据结构-二叉树


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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值