Construct Binary Tree from Preorder and Inorder Traversal

本文详细介绍了如何使用预序和中序遍历数组构建二叉树的过程,包括核心步骤和关键算法逻辑。

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

Question

这里写图片描述

This may not be a tough problem,but that rack my brain by a while…
So I want to record it down for myself.

Code

  struct TreeNode {
      int val;
      struct TreeNode *left;
      struct TreeNode *right;
  };

/*
   1.Take the preorder[0] as root for now;
   2.Find the same node in inorder,get it's index;
   3.Malloc as a new node;
   4.Recursive:
        The point that confused me is how to divide the preorder and inorder.At last,I know:the index of root you find is the boundary.That means how many nodes left the root in inorder is the same as how many nodes left in preorder.
*/
struct TreeNode* buildTreePreorderInorder(int* preorder, int preorderSize, int* inorder, int inorderSize) {
    if(preorderSize<=0 || inorderSize<=0)
        return NULL;
        struct TreeNode *root=NULL;
        int val = preorder[0];
        int i=0;
        for(;i<inorderSize && val!=inorder[i];++i);
        if(i>=inorderSize)
            return NULL;
        root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
        root->val = val;
        root->left = buildTreePreorderInorder(&preorder[1],i,inorder,i);
        root->right = buildTreePreorderInorder(&preorder[i+1],preorderSize-1-i,&inorder[i+1],inorderSize-i-1);
        return root;
}

//
struct TreeNode* buildTreeInorderPostorder(int* inorder, int inorderSize, int* postorder, int postorderSize) {
    if(inorderSize<=0 || postorderSize<=0)
        return NULL;
    struct TreeNode *root = NULL;
    int val = postorder[postorderSize-1];
    int i = 0;
    for(;i<inorderSize && val!=inorder[i];++i);
    if(i>=inorderSize)
        return NULL;
    root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val = val;
    root->left = buildTreeInorderPostorder(inorder,i,postorder,i);
    root->right = buildTreeInorderPostorder(&inorder[i+1],inorderSize-i-1,&postorder[i],postorderSize-1-i);
    return root;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值