[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=2

思路

简单的二叉树遍历,遍历的过程中记录之前的路径,一旦遍历到叶子节点便将该路径加入结果中。

代码

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/2

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) 递归栈空间

思路

两个节点之间的最短路径一定会经过两个节点的最小公共祖先,所以我们可以用LCA的解法。不同于LCA的是,我们返回不只是标记,而要返回从目标结点递归回当前节点的路径。当遇到最小公共祖先的时候便合并路径。需要注意的是,我们要单独处理目标节点自身是最小公共祖先的情况。

代码

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;
    }
}
    原文作者:ethannnli
    原文地址: https://segmentfault.com/a/1190000003465753
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞