求一个二叉树的任意两个节点的距离

这个题目结合了最小公共祖先和求一个结点的层数两个题

首先找到两个结点的最小公共祖先后,
二叉树中两个结点的距离

问题
对于普通的二叉树,如何找到两个给定节点之间的距离?距离是指连接两个节点所需要的最小边的条数。
例如下面的二叉树:
在这里插入图片描述
这个问题很全面的考察了二叉树的相关的知识,建议大家先尝试自己解决
分析:
假设给定的节点为node1,node2,可以分为下面的两种情况:
1)node1是node2的祖先节点或孩子结点,可以理解为两个节点在一条线上。例如:Dist(2,4),Dist(6,1)
2)node1和node2没有直接或间接的父子关系。例如,Dist(4,3),他们需要一个共同的祖先结点1连接起来
假设lca是两个节点的最低公共祖先节点:
Dist(n1,n2)=Dist(root,n1)+Dist(root,n2)-2*Dist(root,lca)

class Solution1 {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        return dfs(root,p,q);
    }
    TreeNode* dfs(TreeNode* root,TreeNode* p,TreeNode* q){
        if(root == nullptr) return nullptr;
        if(root == p || root == q) return root;
        auto left = dfs(root->left,p,q);
        auto right = dfs(root->right,p,q);
        if(left && right) return root;
        return left?left:right;
    }
    int findLevel(TreeNode* root,TreeNode* node){
        if(root == nullptr) return -1;
        if(root == node) return 0;
        auto level = findLevel(root->left,node);
        if(level == -1){
            level = findLevel(root->right,node);
        }
        if(level != -1)
            return level+1;
        return -1;
    }
    int TowNodeDistance(TreeNode* root, TreeNode* p, TreeNode* q){
        if(root == nullptr) return 0;
        auto lca = lowestCommonAncestor(root,p,q);
        int dis_lca = findLevel(root,lca);
        int dis1 = findLevel(root,p);
        int dis2 = findLevel(root,q);
        return dis1 + dis2 - 2*dis_lca;
    }
};
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值