二叉树的最大路径和与最远结点距离

这篇博客探讨了如何在二叉树中找到连接任意两个节点的最大路径和,以及计算节点的最远距离。通过分析每个节点的三种可能路径,可以确定整棵树的最大路径和。此外,还提到了另一种解决节点最远距离问题的递归方法。
摘要由CSDN通过智能技术生成

首先确定一下单路径的定义:某个结点的单路径就是只经过该结点且不同时包含其左右子树上的结点的路径

一、求连接二叉树的任意两个结点的路径的最大和

分析:对于二叉树上的每一个结点,求出经过它的路径的最大和,并更新这个最大和即可。经过它的最大和路径可能有三种情况:

1、其左子结点的最大单路径和大于0,且其右子结点的最大单路径和大于0,那么经过该结点的最大和路径通过该结点跨过左右子树

2、其左子结点和右子结点有且仅有一个最大单路径和大于0,那么经过该结点的最大和路径就是它的某一个(大于0)子结点的单路径上加上该结点

3、其左右子结点的最大单路径和都不大于0,那么最大和路径就是该结点本身

//求二叉树最大路径和,所求的路径位于任意两个结点之间
class Solution1 {
private:
    int max_sum;
    //返回以root为终点的路径最大和
    int maxSinglePathSum(TreeNode* root)
    {
        if (root == NULL)
        {
            return 0;
        }
        int left = maxSinglePathSum(root->
二叉树中,"最深间隔最远的节点"通常指的是树中最深处的两个节点之间的最大距离。这个概念有时也被称为“深度优先搜索(DFS)的最大跨度”。为了找到这样的两个节点,我们需要执行以下步骤: 1. **计算深度**:对每个节点进行深度计算,可以通过递归的方式从根节点开始,每次移动到左子节点或右子节点时,深度加一,直到遇到空节点。 2. **记录路径**:同时在访问节点的过程中,维护一个当前路径数组,记录下路径上所有节点的索引或位置。 3. **找出最长路径**:遍历完所有节点后,比较每一对相邻节点(即深度相同的节点)的距离,取其中最大距离作为结果。 4. **确定节点**:最后找到深度最大且间距最大的那对节点,可能是同一侧的两个极端节点,也可能是不同侧面的节点。 下面是一个简单的C语言伪代码示例: ```c struct Node { int value; struct Node* left, *right; }; int maxDepthInterval(struct Node* root) { if (root == NULL) return 0; // 计算深度并存储节点位置 int depth[height], index = 0; dfs(root, 0, depth, &index); // 初始化最大间隔为0 int maxSpan = 0; for (int i = 1; i < height; i++) { for (int j = 0; j <= index - i; j++) { int span = abs(depth[j] - depth[j + i]); if (span > maxSpan) { maxSpan = span; // 更新最远节点的位置 int node1 = depth[j], node2 = depth[j + i]; } } } return maxSpan; } void dfs(struct Node* node, int depth, int* depthArray, int* index) { if (node) { *depthArray[*index++] = depth; dfs(node->left, depth+1, depthArray, index); dfs(node->right, depth+1, depthArray, index); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值