1740 找到二叉树中的距离

给定二叉树的根节点和两个整数p、q,求解二叉树中值为p和q的节点间的距离。距离定义为从一个节点到另一个节点的路径上边的数量。可以通过找到两个节点的最近公共祖先,然后分别计算到这两个节点的距离来解决。
摘要由CSDN通过智能技术生成

题目描述:
给定一棵二叉树的根节点 root 以及两个整数 p 和 q ,返回该二叉树中值为 p 的结点与值为 q 的结点间的 距离 。
两个结点间的 距离 就是从一个结点到另一个结点的路径上边的数目。

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 0
输出:3
解释:在 5 和 0 之间有 3 条边:5-3-1-0

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 7
输出:2
解释:在 5 和 7 之间有 2 条边:5-2-7

示例 3:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 5
输出:0
解释:一个结点与它本身之间的距离为 0

提示:
树中结点个数的范围在 [1, 104].
0 <= Node.val <= 109
树中所有结点的值都是唯一的.
p 和q 是树中结点的值.

方法1:
主要思路:解题链接汇总
(1)先找出两个结点的最近公共祖先;
(2)然后从最近公共祖先出发,找出到两个结点之间的距离;

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
   
public:
	//找出两个结点的最近公共祖先
    TreeNode* find_node(TreeNode* root,int p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过递归的方式遍历整个二叉树,同时记录当前节点到根节点的路径上的节点个数,找到距离*p最近的叶子节点。 具体实现如下: ```c struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; int findClosestLeaf(struct TreeNode* t, struct TreeNode* p) { if (!t) return INT_MAX; // 递归到空节点,返回一个较大的值,表示不存在叶子节点 if (t == p && !t->left && !t->right) return 0; // 当前节点就是目标节点,并且当前节点是叶子节点,返回0 int left = findClosestLeaf(t->left, p); // 递归查找左子树 int right = findClosestLeaf(t->right, p); // 递归查找右子树 if (left <= right) { // 如果左子树离目标节点更近 if (t->left && !t->right) { // 如果左子树存在,右子树不存在,说明t的右子树到叶子节点的距离为INT_MAX return left + 1; // 返回左子树到叶子节点的距离 } else { // 否则,t的左右子树都存在 int dist = findNearestLeaf(t->right, left + 2); // 递归查找t的右子树到叶子节点的距离 return dist <= right ? dist : right; // 返回左子树到叶子节点的距离和右子树到叶子节点的距离的较小值 } } else { // 如果右子树离目标节点更近 if (t->right && !t->left) { // 如果右子树存在,左子树不存在,说明t的左子树到叶子节点的距离为INT_MAX return right + 1; // 返回右子树到叶子节点的距离 } else { // 否则,t的左右子树都存在 int dist = findNearestLeaf(t->left, right + 2); // 递归查找t的左子树到叶子节点的距离 return dist <= left ? dist : left; // 返回左子树到叶子节点的距离和右子树到叶子节点的距离的较小值 } } } ``` 该函数的时间复杂度为 $O(n)$,其 $n$ 为二叉树的节点个数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值