LeetCode257題:二叉樹的所有路徑
阿新 • • 發佈:2018-12-26
思路:
關鍵點是路徑的定義,即根結點到葉子節點。而判斷是否為葉子節點只需要判斷其左右子結點是否都為空即可。
遞迴實現,如果當前節點不為空就將其值val加入到stringbuffer中,並在此條件下判斷它是否為葉子節點(即左右子節點都為空),如果是則將stringbuffer新增到list中,否則,如果有左子節點,則遞迴到左子節點,如果有右子節點,則遞迴到右子節點。需要注意的是,遞迴的時候,要新增“->”字串,並且每個遞迴結束後,要刪除最後的“->val”以還原到以前的狀態。
public List<String> binaryTreePaths(TreeNode root) { List<String> list = new ArrayList<String>(); if(root == null) return list; StringBuffer sb = new StringBuffer(); fun(root,sb,list); return list; } public void fun(TreeNode root,StringBuffer sb,List<String> list){ sb.append(root.val); if(root.left == null && root.right == null){ list.add(sb.toString());//此節點為葉子節點,將路徑新增到list中後返回 return; } if(root.left != null){ sb.append("->"); fun(root.left,sb,list); sb.delete(sb.lastIndexOf(">")-1, sb.length());//刪除最後的節點及其之前的“->”以還原到遞迴之前的狀態 } if(root.right != null){ sb.append("->"); fun(root.right,sb,list); sb.delete(sb.lastIndexOf(">")-1, sb.length()); } }
這道題本來並不難,但要求輸出的路徑中需要包含“->”,這樣在刪除的時候就多了一點需要考慮的情況。