剑指 Offer 07. 重建二叉树(递归)

该博客介绍了如何通过先序和中序遍历序列,利用递归算法来构建二叉树。首先定义了二叉树节点的结构,然后通过递归函数myBuildTree实现了从给定的两个序列构建树的过程。递归终止条件是序列为空,接着找到根节点在中序序列中的位置,最后分别构建左子树和右子树,最终返回根节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

解法:递归

算法过程

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 struct TreeNode* newTreeNode(int val)
 {
     struct TreeNode *root = malloc(sizeof(struct TreeNode));
     root->val = val;
     root->left = NULL;
     root->right = NULL;
     return root;
 }

struct TreeNode* myBuildTree(int *pre, int *in, int preL, int preR, int inL, int inR)
{
     // pre:先序序列, in:中序序列
    // [preL, preR]先序序列区间, [inL, inR]中序序列区间
    // 递归终止
    if(preL > preR) return NULL;

    // 找到根节点在中序序列中的位置
    struct TreeNode* root = newTreeNode(pre[preL]);
    int inK;
    for(inK = inL; inK<=inR; inK++)
    {
        if(pre[preL] == in[inK]) break;
    }

    //划分左子树与右子树
    int nL = inK - inL;//左子树节点数
    // 根节点的左孩子是左子树的根节点
    root->left = myBuildTree(pre, in, preL+1, preL+nL, inL, inK-1);
    // 根节点的右孩子是右子树的根节点
    root->right = myBuildTree(pre, in, preL+nL+1, preR, inK+1, inR);

    return root;
}

struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
    struct TreeNode *root = myBuildTree(preorder, inorder, 0, preorderSize-1, 0, inorderSize-1);
    return root;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值