[Leetcode] Binary Tree Paths 二叉樹路徑

Root To Leaf Binary Tree Paths

Given a binary tree, return all root-to-leaf paths.

遞歸法

複雜度

時間 O(b^(h+1)-1) 空間 O(h) 遞歸棧空間 對於二叉樹b=2java

思路

簡單的二叉樹遍歷,遍歷的過程當中記錄以前的路徑,一旦遍歷到葉子節點便將該路徑加入結果中。node

代碼

public class Solution {
    
    List<String> res = new ArrayList<String>();
    
    public List<String> binaryTreePaths(TreeNode root) {
        if(root != null) findPaths(root,String.valueOf(root.val));
        return res;
    }
    
    private void findPaths(TreeNode n, String path){
        if(n.left == null && n.right == null) res.add(path);
        if(n.left != null) findPaths(n.left, path+"->"+n.left.val);
        if(n.right != null) findPaths(n.right, path+"->"+n.right.val);
    }
}

2018/2python

class Solution:
    def binaryTreePaths(self, root):
        """
        :type root: TreeNode
        :rtype: List[str]
        """
        result = []
        if root is None:
            return result
        self.findPaths(root, [], result)
        return result
        
    def findPaths(self, node, path, result):
        path.append(str(node.val))
        if node.left is not None:
            self.findPaths(node.left, path, result)
        if node.right is not None:
            self.findPaths(node.right, path, result)
        if node.left is None and node.right is None:
            result.append("->".join(path))
        path.pop()

Node to Node Binary Tree Path

給定一棵二叉樹的根節點和兩個任意節點,返回這兩個節點之間的最短路徑

深度優先標記

複雜度

時間 O(h) 空間 O(h) 遞歸棧空間segmentfault

思路

兩個節點之間的最短路徑必定會通過兩個節點的最小公共祖先,因此咱們能夠用LCA的解法。不一樣於LCA的是,咱們返回不僅是標記,而要返回從目標結點遞歸回當前節點的路徑。當遇到最小公共祖先的時候便合併路徑。須要注意的是,咱們要單獨處理目標節點自身是最小公共祖先的狀況。app

代碼

public LinkedList<TreeNode> helper(TreeNode n, TreeNode p, TreeNode q){
    if(n == null){
        return null;
    }
    
    LinkedList<TreeNode> left = helper(n.left, p, q);
    LinkedList<TreeNode> right = helper(n.right, p, q);
    
    // 當左右都爲空時
    if(left == null && right == null){
        // 若是當前節點是目標節點,開啓一條新路徑
        if(n == p || n == q){
            LinkedList l = new LinkedList<TreeNode>();
            l.add(n);
            return l;
        } else {
        // 不然標記爲空
            return null;
        }
    // 若是左右節點都不爲空,說明是最小公共祖先節點,合併兩條路徑
    } else if(left != null && right != null){
        finalPath.addAll(left);
        finalPath.add(n);
        Collections.reverse(right);
        finalPath.addAll(right);
        return left;
    // 若是當前節點是目標結點,且某一個子樹不爲空時,說明最小公共祖先是節點自身
    } else if (left != null){
        left.add(n);
        if(n == p || n == q){
            finalPath.addAll(left);
        }
        return left;
    } else {
        right.add(n);
        if(n == p || n == q){
            finalPath.addAll(right);
        }
        return right;
    }
}
相關文章
相關標籤/搜索