中级农民
- 积分
- 113
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2012-8-16
- 最后登录
- 1970-1-1
|
感觉每一步都addall好像超过了O(n)? 先用HashMap 更新最小weight,然后走一遍拿到list。还有感觉是postorder?不知道inorder的思路是如何的。还请指点。- import java.util.*;
- import java.lang.*;
- import java.io.*;
- class Ideone {
- private static class TreeNode {
- int val;
- TreeNode left;
- TreeNode right;
- TreeNode(int x) {
- val = x;
- }
- }
- private static HashMap<TreeNode, Integer> weight = new HashMap<TreeNode, Integer>();
- private static List<Integer> findMinPath(TreeNode root) {
- List<Integer> ret = new ArrayList<Integer>();
- postOrder(root);
- findPath(root, ret);
- return ret;
- }
- private static void postOrder(TreeNode cur) {
- if (cur == null) {
- return;
- }
- int leftMin = cur.val;
- if (cur.left != null) {
- postOrder(cur.left);
- leftMin = weight.get(cur.left);
- }
- int rightMin = cur.val;
- if (cur.right != null) {
- postOrder(cur.right);
- rightMin = weight.get(cur.right);
- }
- int curWeight = Math.min(cur.val, Math.min(leftMin, rightMin));
- weight.put(cur, curWeight);
- }
- private static void findPath(TreeNode cur, List<Integer> list) {
- if (cur == null) {
- return;
- }
- list.add(cur.val);
- if (cur.left == null) {
- findPath(cur.right, list);
- return;
- }
- if (cur.right == null) {
- findPath(cur.left, list);
- return;
- }
- int leftWeight = weight.get(cur.left);
- int rightWeight = weight.get(cur.right);
- if (leftWeight > rightWeight) {
- findPath(cur.right, list);
- } else {
- findPath(cur.left, list);
- }
- }
- public static void main (String[] args) throws java.lang.Exception
- {
- TreeNode a = new TreeNode(5);
- TreeNode b = new TreeNode(7);
- TreeNode c = new TreeNode(10);
- TreeNode d = new TreeNode(1);
- TreeNode e = new TreeNode(3);
- TreeNode f = new TreeNode(8);
- a.left = c;
- a.right = e;
- c.left = d;
- c.right = b;
- e.left = f;
- List<Integer> list = findMinPath(a);
- for (int k : list) {
- System.out.println(k);
- }
- }
- }
复制代码 |
|