树形dp

本文通过两道题目详细讲解了树形动态规划(dp)在解决二叉树节点间最大距离问题和多叉树员工派对最大快乐值问题的应用。对于二叉树问题,分析了每个节点的最大距离可能来源于左子树、右子树或左右子树高度之和,并给出代码实现。在多叉树问题中,解释了如何计算员工来或不来时的快乐值,并利用类似思路进行递归处理。总结了树形dp的适用条件和解题步骤,强调了分析节点可能性、列出所需信息、设计递归函数等关键步骤。
摘要由CSDN通过智能技术生成

题目:二叉树节点间的最大距离问题
从二叉树的节点a出发, 可以向上或者向下走, 但沿途的节点只能经过一次, 到达节点b时路径上的节点个数叫作a到b的距离, 那么二叉树任何两个节点之间都有距离, 求整棵树上的最大距离。

分析

对于树上的任意一个节点,它的最大距离有3种可能性,分别是左子树的最大距离、右子树的最大距离、和左子树的高度加右子树的高度加1。如果该节点最大距离等于左子树的最大距离或右子树的最大距离,只需要得到左子树或右子树的最大距离即可,但如果是第三种可能性,则需要得到左右子树的高度。所以每个节点的左孩子和右孩子都应该返回一种结构,该结构中包括以孩子节点节点为根节点的树的最大距离和树的高度,然后根据获取到的左右孩子的信息,选择出自己的最大距离和高度。

代码实现

#include <iostream>

using namespace std;

struct node{
    int data;
    node* left;
    node* right;
    node(int data){
        this->data = data;
        this->left = NULL;
        this->right = NULL;
    }
};

struct Info{
    int maxDistance;
    int height;
    Info(int md,int h){
        maxDistance = md;
        height = h;
    }
};

Info* process(node* root){
    if(root == NULL){
        return new Info(0,0);
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值