二叉树系列——二叉树中任意两个节点之间的最短路径
来源:互联网 发布:淘宝模板的作用 编辑:程序博客网 时间:2024/06/03 12:30
来源:https://segmentfault.com/a/1190000003465753
题目:给定一棵二叉树的根节点和两个任意节点,返回这两个节点之间的最短路径
思路:两个节点之间的最短路径一定会经过两个节点的最小公共祖先,所以我们可以用LCA(最低公共祖先)的解法。不同于LCA的是,我们返回不只是标记,而要返回从目标结点递归回当前节点的路径。当遇到最小公共祖先的时候便合并路径。需要注意的是,我们要单独处理目标节点自身是最小公共祖先的情况。
Java代码实现如下:
public LinkedList<TreeNode> helper(TreeNode n, TreeNode p, TreeNode q){ if(n == null){ return null; } LinkedList<TreeNode> left = helper(n.left, p, q); LinkedList<TreeNode> right = helper(n.right, p, q); // 当左右都为空时 if(left == null && right == null){ // 如果当前节点是目标节点,开启一条新路径 if(n == p || n == q){ LinkedList l = new LinkedList<TreeNode>(); l.add(n); return l; } else { // 否则标记为空 return null; } // 如果左右节点都不为空,说明是最小公共祖先节点,合并两条路径 } else if(left != null && right != null){ finalPath.addAll(left); finalPath.add(n); Collections.reverse(right); finalPath.addAll(right); return left; // 如果当前节点是目标结点,且某一个子树不为空时,说明最小公共祖先是节点自身 } else if (left != null){ left.add(n); if(n == p || n == q){ finalPath.addAll(left); } return left; } else { right.add(n); if(n == p || n == q){ finalPath.addAll(right); } return right; }}
1 0
- 二叉树系列——二叉树中任意两个节点之间的最短路径
- 二叉树系列——路径系列:打印二叉树两个子节点之间的路径以及最低公共祖先
- 二叉树中任意两个节点之间的最大距离
- 如何求二叉树中两个节点的最短路径。
- 【二叉树9】二叉树中任意两个节点的最大路径和
- 二叉树中两节点之间最短路径
- LeetCode—***寻找二叉树中任意两个节点之间的最大值Binary Tree Maximum Path Sum
- 二叉树系列---求二叉树中两个节点之间的最大距离
- 二叉树(13)----求二叉树中任意两个节点之间的距离,递归和非递归
- 二叉树中任意两个节点间的距离 源码
- 二叉树中任意两个节点间的最大距离
- 二叉树中任意两个节点间的最大距离
- 求二叉树的任意两个节点A,B的最邻近的公共父节点
- 二叉树的最长/最短路径
- LCA算法求任意两个节点之间的最小公共祖先(最短路径)
- 二叉搜索树的最短路径,从根节点到叶子节点
- 求任意两个点之间的最短路径
- 二叉搜索树中任意两个节点的最近共同父父节点1(LCA问题)
- Http请求协议
- iOS 开发基础UIControl事件
- VPCS不能通过dhcp协议在win server下获取ip地址的验证性试验
- 20.ELK实时日志分析平台之Elasticsearch 查询简介
- VMWare 12 序列号/注册机
- 二叉树系列——二叉树中任意两个节点之间的最短路径
- strlen()函数 数组长度 C C++
- 【2011集训队出题】Crash的数字表格
- Python list、tuple、dict区别
- 《leetCode》:Intersection of Two Linked Lists
- trick problems
- Rust 中包访问策略和module开发策略
- ViewGroup的自定义
- MOOC《Linux内核分析》第四课