java 二叉树最短路径_二叉树中两节点之间最短路径(转)

转自https://blog.csdn.net/innovate1989/article/details/73350400

参考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 path, TreeNode nodeToFind){

if (root == null) {

return null;

}

//将路径节点添加到栈中

path.push(root.val);

//如果到达了子节点

if (!bLeafIsFound &

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最优二叉树,也称为哈夫曼树,是一种路径长度最短的二叉树Java实现最优二叉树的算法可以使用贪心算法,具体步骤如下: 1. 将所有节点按照权值从小到大排序。 2. 取出权值最小的两个节点作为左右子节点,构建一个新的父节点,父节点的权值为左右子节点的权值之和。 3. 将新构建的父节点插入到原来的节点集合,并删除原来的两个节点。 4. 重复步骤2和3,直到只剩下一个节点为止。 以下是Java代码实现: ``` import java.util.*; public class HuffmanTree { private Node root; private static class Node implements Comparable<Node> { int weight; Node left; Node right; Node(int weight) { this.weight = weight; } boolean isLeaf() { return left == null && right == null; } @Override public int compareTo(Node o) { return Integer.compare(weight, o.weight); } } public HuffmanTree(int[] weights) { PriorityQueue<Node> pq = new PriorityQueue<>(); for (int weight : weights) { pq.offer(new Node(weight)); } while (pq.size() > 1) { Node left = pq.poll(); Node right = pq.poll(); Node parent = new Node(left.weight + right.weight); parent.left = left; parent.right = right; pq.offer(parent); } root = pq.poll(); } public Map<Integer, String> getCodes() { Map<Integer, String> codes = new HashMap<>(); getCodes(root, "", codes); return codes; } private void getCodes(Node node, String code, Map<Integer, String> codes) { if (node.isLeaf()) { codes.put(node.weight, code); } else { getCodes(node.left, code + "0", codes); getCodes(node.right, code + "1", codes); } } } ``` 使用示例: ``` int[] weights = {5, 2, 7, 4, 1}; HuffmanTree tree = new HuffmanTree(weights); Map<Integer, String> codes = tree.getCodes(); for (Map.Entry<Integer, String> entry : codes.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } ``` 输出结果: ``` 1: 1100 2: 101 4: 111 5: 0 7: 100 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值