二叉树中两节点之间最短路径
来源:互联网 发布:自定义号码软件 编辑:程序博客网 时间:2024/06/08 05:59
折腾了一下午,在参考liuyi1207164339帖子和ethannnli的帖子的基础上搞定了这个问题。刚开始头真的大了,感觉有点超出能力范围了。分析了他们的思路,求解这个二叉树中两节点的最短路径这个问题可以分解为三个子问题:1.求出二叉树中两个节点p和q的最小公共祖先 2.分别求出最小公共祖先节点到p和q的路径 3.归并求出的两条路径
问题1求解可以参考:https://segmentfault.com/a/1190000003509399,ethannnli 采用了二分法和深度搜索两种方法求解。
问题2求解可以参考:http://blog.csdn.net/liuyi1207164339/article/details/50916687,采用深度搜索求出lca到p或者q的路径。
问题3求解比较简单,我是直接通过对前两步返回的字符串进行后处理。
以如下二叉树作为测试二叉树:
public class FindShortestPath {
//查找指定节点的标记boolean bLeafIsFound = false;String path1;public String findPath(TreeNode root, Stack<Integer> path, TreeNode nodeToFind){if (root == null) {return null;}//将路径节点添加到栈中path.push(root.val);//如果到达了子节点if (!bLeafIsFound && root.val == nodeToFind.val) {//打印路径path1 = printPath(path);bLeafIsFound = true;return path1;}//查询左子树if (!bLeafIsFound && root.left != null) {findPath(root.left,path, nodeToFind);}//查询右子树if (!bLeafIsFound && root.right != null) {findPath(root.right, path, nodeToFind);}//如果没找到则弹栈if (!bLeafIsFound) {path.pop();}return path1 == null ? null : path1;}public String printPath(Stack<Integer> path){int len = path.size();String s = ""+ path.pop();for (int i = 1; i < len; i++) {if (path.peek() != null) {s += "->" + path.pop();}}System.out.println(s);return s;}public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q){//发现目标节点则通过返回值标记该子树发现了某个目标节点if (root == null || root == p || root == q) {return root;}//查看左子树中是否有目标节点,没有为nullTreeNode left = lowestCommonAncestor(root.left, p, q);//查看右子树中是否有目标节点,没有为nullTreeNode right = lowestCommonAncestor(root.right, p, q);//都不为空,则说明左右子树都有目标节点,则公共祖先就是本身。if (left != null && right != null) {return root;}return left == null ? right : left;}public void findPathOfTwoNode(TreeNode root,TreeNode p, TreeNode q){Stack<Integer> path1 = new Stack<Integer>();Stack<Integer> path2 = new Stack<Integer>();//寻找两个路径的交点,即最小公共祖先TreeNode lca = lowestCommonAncestor(root, p, q);//得到p节点的路径System.out.println("最小公共祖先节点" + lca.val + "和节点" + p.val + "之间的路径");String s1 = findPath(lca, path1, p);bLeafIsFound = false;//全局变量复位 //得到q节点的路径System.out.println("最小公共祖先节点" + lca.val + "和节点" + q.val + "之间的路径");String s2 = findPath(lca, path2, q);bLeafIsFound = false;//全局变量复位 //合并两条路径去掉重复的最小公共祖先String[] split = s2.split("->");String s3 = s1 + "->" + split[0];for (int i = 1; i < split.length; i++) {if (Integer.parseInt(split[i]) != lca.val) {s3 +="->" + split[i];}}System.out.println("归并后的路径为:" + s3);}public static void main(String[] args) {TreeNode node1 = new TreeNode(1);TreeNode node2 = new TreeNode(2);TreeNode node3 = new TreeNode(3);TreeNode node4 = new TreeNode(4);TreeNode node5 = new TreeNode(5);TreeNode node6 = new TreeNode(6);TreeNode node7 = new TreeNode(7);TreeNode node8 = new TreeNode(8);node1.left = node2;node1.right = node3;node2.left = node4;node3.left = node5;node3.right = node6;node4.right = node7;node6.left = node8;FindShortestPath findShortestPath = new FindShortestPath();findShortestPath.findPathOfTwoNode(node1, node7, node3);}}
我使用节点7和节点3作为p和q,测试结果如下:
结果没有什么问题,刚开始学习算法,肯定存在很多不足之处,希望大家多提意见,共同进步!
阅读全文
0 0
- 二叉树中两节点之间最短路径
- 二叉树系列——二叉树中任意两个节点之间的最短路径
- 二叉搜索树的最短路径,从根节点到叶子节点
- 二叉树两节点的最短路径(Homework2 of Advanced Network)
- 如何求二叉树中两个节点的最短路径。
- 图的所有节点对之间的最短路径—Floyd算法(C++)
- LCA算法求任意两个节点之间的最小公共祖先(最短路径)
- 【算法导论】【Floyd-Warshall 算法】每对节点之间的最短路径
- 所有节点对的最短路径
- 邻接矩阵计算节点对最短路径
- 所有节点对最短路径
- 无向图中节点的迭代得到从起始节点到结束节点之间的所有路径,并从中得到最短路径的节点
- 二叉树的最长/最短路径
- C# 实现最短二叉树路径
- 任意两点之间最短路径
- 趣味算法-城市之间最短路径
- 两点之间的所有最短路径
- 变形最短路径,最安全节点求解
- 用PHP实现二分法查找之递归和迭代
- Java自定义注解简单用法(使用注解的方式将javabean类转换为数据库表)
- 2017-6.18 算法竞赛分享会
- 简易版购物车
- 枚举变量enum的大小
- 二叉树中两节点之间最短路径
- Eclipse常用快捷键
- 面试题10:二进制中1的个数
- LeetCode之路:13. Roman to Integer
- ServletResponse和Servlet的生命周期
- UVA 11504--Wine trading in Gergovia(思维题)
- 在Windows下Android Studio配置文件路径修改
- 探测站点是否正在使用指定的CDN
- Dagger2 学习与理解