1. 程式人生 > >LeetCode257題:二叉樹的所有路徑

LeetCode257題:二叉樹的所有路徑

思路: 

關鍵點是路徑的定義,即根結點到葉子節點。而判斷是否為葉子節點只需要判斷其左右子結點是否都為空即可。

遞迴實現,如果當前節點不為空就將其值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());
            }
    }

這道題本來並不難,但要求輸出的路徑中需要包含“->”,這樣在刪除的時候就多了一點需要考慮的情況。