二叉树的前中后序遍历
发布日期:2021-05-07 11:08:11 浏览次数:23 分类:精选文章

本文共 2392 字,大约阅读时间需要 7 分钟。

二叉树的前序、中序、后序遍历实现

给定二叉树的根节点 root,返回它的前序、中序、后序遍历结果。

前序遍历(Preorder Traversal)

前序遍历的特点是先访问根节点,再访问左子树,最后访问右子树。

实现步骤

  • 获取节点总数:首先需要知道二叉树中节点的总数。这可以通过递归遍历树节点,计算左右子树节点数再加1来实现。
  • 创建存储数组:根据节点总数,创建一个足够大的数组来存储遍历结果。
  • 递归填充数组:从根节点开始,按照前序方式依次填充数组,先填充根节点值,然后递归填充左子树,最后填充右子树。
  • 代码示例

    int GetSize(struct TreeNode* root) {
    if (root == NULL) return 0;
    return GetSize(root->left) + GetSize(root->right) + 1;
    }
    void Traversal(int* arr, struct TreeNode* root, int* count) {
    if (root != NULL) {
    arr[*count] = root->val;
    (*count)++;
    Traversal(arr, root->left, count);
    Traversal(arr, root->right, count);
    }
    }
    int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int size = GetSize(root);
    int* arr = (int*)malloc(sizeof(int) * size);
    int count = 0;
    Traversal(arr, root, &count);
    *returnSize = count;
    return arr;
    }

    中序遍历(Inorder Traversal)

    中序遍历的特点是先访问左子树,最后访问右子树,根节点值最后一个访问。

    实现步骤

  • 获取节点总数:与前序相同,通过递归计算节点总数。
  • 创建存储数组:同样创建一个足够大的数组。
  • 递归填充数组:先递归填充左子树,接着填充根节点值,最后递归填充右子树。
  • 代码示例

    int GetSize(struct TreeNode* root) {
    if (root == NULL) return 0;
    return GetSize(root->left) + GetSize(root->right) + 1;
    }
    void Traversal(int* arr, struct TreeNode* root, int* count) {
    if (root) {
    Traversal(arr, root->left, count);
    arr[(*count)++] = root->val;
    Traversal(arr, root->right, count);
    }
    }
    int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    int size = GetSize(root);
    int* arr = (int*)malloc(sizeof(int) * size);
    int count = 0;
    Traversal(arr, root, &count);
    *returnSize = count;
    return arr;
    }

    后序遍历(Postorder Traversal)

    后序遍历的特点是先访问左子树和右子树,最后访问根节点。

    实现步骤

  • 获取节点总数:同样通过递归计算节点总数。
  • 创建存储数组:创建一个足够大的数组。
  • 递归填充数组:先递归填充左子树,再递归填充右子树,最后填充根节点值。
  • 代码示例

    int GetSize(struct TreeNode* root) {
    if (root == NULL) return 0;
    return GetSize(root->left) + GetSize(root->right) + 1;
    }
    void Traversal(int* arr, struct TreeNode* root, int* count) {
    if (root) {
    Traversal(arr, root->left, count);
    Traversal(arr, root->right, count);
    arr[(*count)++] = root->val;
    }
    }
    int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    int size = GetSize(root);
    int* arr = (int*)malloc(sizeof(int) * size);
    int count = 0;
    Traversal(arr, root, &count);
    *returnSize = count;
    return arr;
    }

    总结

    这三种遍历方法虽然实现方式不同,但核心思想都是通过递归的方式遍历树节点,区别仅在于访问顺序的不同。通过合理设计递归函数和存储数组,可以轻松实现任意顺序的遍历。

    上一篇:位段、枚举、联合
    下一篇:顺序表和链表的区别和联系

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月24日 00时13分45秒