1. 程式人生 > 實用技巧 >java遍歷樹,並得到每條根到葉子節點的路徑

java遍歷樹,並得到每條根到葉子節點的路徑

1. 求數的所有根到葉子節點的路徑,並求出每條路徑上節點值(timeoutMillis)的和,輸出最大路徑上的數值之和(整數值)

輸入是一個字串:

HEAD`0`A,B,C, A`20`END, B`100`END, C`50`D,E, D`80`F, E`150`END, F`30`END
含義為:HEAD為頂點,ABC為A的孩子節點,C的孩子節點為DE,D的孩子節點為F,END代表為葉子節點沒有孩子,整數值代表每個節點的timeoutMillis
import java.util.*;
import java.util.stream.Collectors;

class WorkflowNode {
    String nodeId;
    
int timeoutMillis; List<WorkflowNode> nextNodes; boolean initialised; public static WorkflowNode load(String value) { // Create head node; Map<String, WorkflowNode> map = new HashMap<>(); WorkflowNode head = new WorkflowNode("HEAD", 0, null); map.put(head.nodeId, head);
for (String nodeValue : value.split("\\|")) { String[] properties = nodeValue.split("\\`"); WorkflowNode node = map.get(properties[0]); node.timeoutMillis = Integer.parseInt(properties[1]); node.initialised = true; // Check next nodes if
(properties[2].equals("END")) { continue; } node.nextNodes = Arrays.stream(properties[2].split(",")) .map(p -> new WorkflowNode(p, 0, null)) .collect(Collectors.toList()); node.nextNodes.forEach(p -> map.put(p.nodeId, p)); map.put(node.nodeId, node); } return head; } public WorkflowNode(String nodeId, int timeoutMillis, List<WorkflowNode> nextNodes) { this.nodeId = nodeId; this.timeoutMillis = timeoutMillis; this.nextNodes = nextNodes; } @Override public String toString() { // TODO Auto-generated method stub return super.toString(); } } public class Main { public static Map<String, List> map = new HashMap<>(); public static void iteratorNode(WorkflowNode node,Stack<WorkflowNode> nodeStack){ nodeStack.push(node); List<WorkflowNode> childNodes = node.nextNodes; if(childNodes==null){ List<WorkflowNode> list = new ArrayList<WorkflowNode>(); Iterator<WorkflowNode> iterator = nodeStack.iterator(); while(iterator.hasNext()){ list.add(iterator.next()); } map.put(node.nodeId, list); return; }else{ Iterator<WorkflowNode> iterator=childNodes.iterator(); while(iterator.hasNext()){ WorkflowNode childNode=iterator.next(); iteratorNode(childNode, nodeStack); nodeStack.pop(); } } } public static int getPathTime(List list){ int sumTime=0; Iterator<WorkflowNode> iterator = list.iterator(); while(iterator.hasNext()){ WorkflowNode node = iterator.next(); sumTime+=node.timeoutMillis; } return sumTime; } public static void main(String args[]) { // String value="HEAD`0`A,B,C|A`20`END|B`100`END|C`50`D,E|D`80`F|E`150`END|F`30`END"; // System.out.println(Arrays.toString(value.split("\\|"))); // [HEAD`0`A,B,C, A`20`END, B`100`END, C`50`D,E, D`80`F, E`150`END, F`30`END] Scanner cin = new Scanner(System.in); while (cin.hasNext()) { WorkflowNode node = WorkflowNode.load(cin.next()); // System.out.println(node.nodeId+node.timeoutMillis+node.nextNodes.get(0).nodeId+node.initialised); Stack<WorkflowNode> nodeStack=new Stack<>(); iteratorNode(node, nodeStack); // todo 遍歷儲存路徑 int time = Integer.MIN_VALUE; for (Map.Entry<String, List> entry : map.entrySet()) { List list = entry.getValue(); time = Math.max(getPathTime(list),time); } System.out.println(time); } } }