二叉树中两节点之间最短路径
//查找指定节点的标记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);}}
二叉树中两节点之间最短路径相关推荐
- 微软算法100题11 求二叉树中两节点之间的最大距离
第11 题 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数. 写一个程序, 求一棵二叉树中相 ...
- 二叉树任意两节点之间的最短距离
public class 二叉树任意两节点之间的路径 {public static void main(String[] args) {TreeNode node = new TreeNode(1); ...
- 左神算法:调整搜索二叉树中两个错误的节点(Java版)
本题来自左神<程序员代码面试指南>"调整搜索二叉树中两个错误的节点"题目. 题目 原问题: 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再 ...
- 求二叉树中两个节点的最远距离
问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 计算一个二叉 ...
- 二叉树两节点距离java,求二叉树中两个节点的最远距离
问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 计算一个二叉 ...
- 求一颗二叉树中两个节点的最低公共父节点
题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...
- 调整搜索二叉树中两个错误的节点
一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回.已知二叉树中所有节点的 值都不一样,给定二叉树的头节点 head,返回一个长度为 ...
- 寻找搜索二叉树中两个错误的节点
题目:一颗二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这颗二叉树不再是搜索二叉树,请找到两个错误节点并返回.已知二叉树中所有节点的值都不一样,给定二叉树的头节点head,返回一个长度为2 ...
- 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)
这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个 ...
最新文章
- OpenGL相机控制之一
- 【C++】 类型转换
- gdb 收到SIGPIPE信号
- Linux的实际操作:文件目录类的实用指令(init运行级别和找回root密码)
- js百度地图android定位不准,百度地图js定位不准
- SQL Server 2008 SP1
- 通过分区(Partitioning)提高Spark的运行性能
- html5表单新增验证属性,HTML5表单增强属性
- 【Hadoop】HDFS三组件:NameNode、SecondaryNameNode和DataNode
- matlab imagesc clims,imagesc
- oracle笔记(2010-1-30)
- nodejs遍历文件夹下所有文件
- 3D 旋转相册 立方体的盒子 相册(源码分享)
- 一文读懂锂电池叠片、卷绕工艺区别!
- 最简单的方法来压缩图片,改变图片大小
- 域名被抢注了怎么办?
- @click.stop作用(阻止点击事件继续传播,即阻止事件冒泡)
- 感恩生命,永不放弃——学习力克胡哲
- Mansory的简单使用
- 紫光展锐:大破大立 做数字世界的生态承载者