初学二叉树札记2!SDUTACM寒假集训

讲解的第二道题数据结构上机测试4.1:二叉树的遍历与应用1题目地址
(1)构建结构体
(2)构建二叉树函数以及恢复原二叉树结构的函数
(3 )后序函数
(4)主函数
(1)构建结构体
在二叉树题目中,结构体构建的模板一般是相同的
struct lqc
{
int data;
struct lqc *ltree,*rtree;
};
(2)本题中最重要的就是这个函数的构建;这个函数又可以分为几个小部分
【1】结构体类型函数的定义
【2】判断字符串是否为空
【3】找到根的值!
【4】找到二叉树以根为界分开的左右两部分!
【5】再次使用这个函数,以求出二叉树的左右部分(此处容易出错,应该多加注意!)
【6】返回根的值!
【1】函数的定义
结构体类型函数
struct lqc *create()
()内为三个变量
1:字符串长度len
2:先序结果st1
3:中序结果st2
则如下

struct lqc *create(int len,char st1,char st2)
{
}

【2】此处即为简单的判断语句{为判断长度是否为0}
如果长度为0;返回空(NULL)
如下

if(len==0)
{
return NULL
}

【3】根据题目给出的先序以及中序的结果,很容易找到根的值!
即为先序的第一个!
此处应该先对root开辟空间

root=(struct lqc *)malloc(sizeof(struct lqc));
root->data=st1[0];

【4】
寻找左右两部分也十分容易,根据根的值以及中序结果,则根左边的即为左边部分,根右边即为右边部分!
此处为在中序结果中寻找根的语句。

for(i=0;i<len;i++)
{
 if(root->data==st2[i])
 {
   break;
   }
 }

【5】
因为如果将左右两部分看做子二叉树的话,左右两部分还需要进行create函数操作!
求root->l以及root->r

root->l=create(i,st1+1,st2);这里的st1+1以及st2代表的是位置
root->r=create(len-i-1,st1+i+1,st2+i+1);

【6】

return root;

(3)后续函数还与原来类似

void houxu(struct lqc *p)
{
 if(p!=NULL)
 {
   houxu(p->ltree);
   houxu(p->rtree);
   printf("%c",p->data);
  }
}

(4)主函数

int main()
{
    int len;
    char st1[100],st2[100];
    struct lqc * root;
    scanf("%s %s",st1,st2);
    len=strlen(st1);
    root=create(len,st1,st2);
    houxu(root);
    printf("\n");
    return 0;
}

完整代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct lqc
{
    char data;
    struct lqc *ltree,*rtree;
};

struct lqc *create(int len,char *st1,char *st2)
{
    struct lqc *root;
    int i;
    if(len==0)
    {
        return NULL;
    }
    root=(struct lqc *)malloc(sizeof(struct lqc));
    root->data=st1[0];
    for(i=0; i<len; i++)
    {
        if(st2[i]==root->data)
        {
            break;
        }
    }
    root->ltree=create(i,st1+1,st2);
    root->rtree=create(len-i-1,st1+1+i,st2+1+i);
    return root;
}
void houxu(struct lqc *p)
{
    if(p!=NULL)
    {
        houxu(p->ltree);
        houxu(p->rtree);
        printf("%c",p->data);
    }
}
int main()
{
    int len;
    struct lqc *root;
    char st1[100],st2[100];
    gets(st1);
    gets(st2);
    len=strlen(st1);
    root=create(len,st1,st2);
    houxu(root);
    printf("\n");
    return 0;
}

部分代码为参考王子原同学的博客王子原

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二叉树的最大路径和ACM模式是一个经典的算法问题。在这个模式中,我们需要找到二叉树中两个节点之间的路径,使得路径上节点值的和最大。为了解决这个问题,我们可以使用递归的方法。 首先,我们定义一个辅助函数helper来计算从当前节点开始的最大路径和。在这个函数中,我们首先检查当前节点是否为空,如果是空节点,则返回0。然后,我们递归地计算左子树和右子树的最大路径和,分别存储在变量l和r中。接下来,我们计算过当前节点的最大路径和curSum,它可以是当前节点的值与左子树路径和、右子树路径和的和中的最大值。然后,我们计算如果将当前节点作为根节点时的最大路径和curMax,它可以是curSum与左子树路径和、右子树路径和的和中的最大值。最后,我们更新全局最大路径和m为m和curMax中的较大值,并返回过当前节点的最大路径和curSum。 在主函数maxPathSum中,我们首先检查根节点是否为空,如果是空节点,则返回0。然后,我们定义一个变量m来存储全局最大路径和的初始值INT_MIN。接下来,我们调用辅助函数helper来计算最大路径和,并将m传入函数,以便在函数中更新最大值m。最后,我们返回最大路径和m。 代码实现如下: ``` int maxPathSum(TreeNode* root) { if(!root) return 0; int m=INT_MIN; helper(root,m); return m; } int helper(TreeNode* root,int &m) { if(!root) return 0; int l=helper(root->left,m); int r=helper(root->right,m); int curSum=max(root->val,max(l+root->val,r+root->val)); int curMax=max(curSum,l+r+root->val); m=max(m,curMax); return curSum; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值