二叉树的直径(任意两个结点路径长度中的最大值)

题目

在这里插入图片描述

代码

class Solution {
    int ans = 1;
    public int diameterOfBinaryTree(TreeNode root) {
        depth(root);
        return ans-1;
    }

    public int depth(TreeNode node) {
        if (node == null) return 0;
        // 获取左孩子为根的树的深度
        int leftDept = depth(node.left); 
        // 获取右孩子为根的树的深度
        int rightDept = depth(node.right); 
        // leftDept+rihtDept+1表示以node为根时二叉树的最大直径
        ans = Math.max(ans,leftDept+rightDept+1); 
        // 返回以node为根生成树的深度
        return Math.max(leftDept,rightDept)+1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要创建二叉树,可以使用结构体来定义二叉树结点,结构体包含指向左右子的指针,如下所示: ``` struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; ``` 接着可以使用递归的方法创建二叉树,每次读入一个结点的值,如果值为0,则表示该结点为空;否则新建一个结点,并递归创建左右子。具体代码如下: ``` struct TreeNode* createTree() { int val; scanf("%d", &val); if (val == 0) { return NULL; } struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = val; node->left = createTree(); node->right = createTree(); return node; } ``` 关于求任意两个结点的距离,可以转化为求它们的最近公共祖先节点,并计算出到该祖先节点的距离。可以使用后序遍历的方法求解。对于每个节点,先递归处理其左右子,得到它们的最近公共祖先节点和距离,然后根据当前节点的左右子情况计算出当前节点的最近公共祖先节点和距离,并返回给上一级调用。具体代码如下: ``` struct Result { struct TreeNode* ancestor; // 最近公共祖先 int distance; // 距离 }; struct Result postorder(struct TreeNode* root, int p, int q) { if (root == NULL) { return (struct Result){NULL, -1}; } struct Result left = postorder(root->left, p, q); struct Result right = postorder(root->right, p, q); if (left.ancestor != NULL && left.ancestor != NULL) { // p和q分别在左右子树中 return (struct Result){root, left.distance + right.distance + 2}; } else if (root->val == p || root->val == q) { // 当前节点是p或q的一个 if (left.ancestor != NULL || right.ancestor != NULL) { // 另一个在子树中 return (struct Result){root, left.distance + right.distance + 2}; } else { // 另一个不在子树中 return (struct Result){root, 0}; } } else { // p和q都在同一子树中 if (left.ancestor != NULL) { return (struct Result){left.ancestor, left.distance + 1}; } else { return (struct Result){right.ancestor, right.distance + 1}; } } } int distance(struct TreeNode* root, int p, int q) { struct Result result = postorder(root, p, q); return result.distance; } ``` 注意,在使用完二叉树后需要释放内存,可以使用递归的方法进行释放,具体代码如下: ``` void freeTree(struct TreeNode* root) { if (root == NULL) { return; } freeTree(root->left); freeTree(root->right); free(root); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值