872. Leaf-Similar Trees

Consider all the leaves of a binary tree.  From left to right order, the values of those leaves form a leaf value sequence.

872. Leaf-Similar Trees

For example, in the given tree above, the leaf value sequence is (6, 7, 4, 9, 8).

Two binary trees are considered leaf-similar if their leaf value sequence is the same.

Return true if and only if the two given trees with head nodes root1 and root2 are leaf-similar.

Note:

  • Both of the given trees will have between 1 and 100 nodes.

M1: 把两个树的leaf都存下来,再比较

time: O(n), space: O(logn)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        if(root1 == null && root2 == null) {
            return true;
        }
        if(root1 == null || root2 == null) {
            return false;
        }
        List<Integer> l1 = leaves(root1, new ArrayList<>());
        List<Integer> l2 = leaves(root2, new ArrayList<>());
        return l1.equals(l2);
    }
    
    public List<Integer> leaves(TreeNode root, List<Integer> list) {
        if(root == null) {
            return null;
        }
        if(root.left == null && root.right == null) {
            list.add(root.val);
        }
        leaves(root.left, list);
        leaves(root.right, list);
        return list;
    }
}

M2: 用一个stack记录dfs的路径,一旦dfs过程中有对应leaf的值不相等就可以退出dfs,直接返回false,而不必走完全程

time: O(n), space: O(logn)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        if(root1 == null && root2 == null) {
            return true;
        }
        if(root1 == null || root2 == null) {
            return false;
        }
        
        Stack<TreeNode> s1 = new Stack<>(), s2 = new Stack<>();
        s1.push(root1);
        s2.push(root2);
        
        while(!s1.isEmpty() && !s2.isEmpty()) {
            if(getLeaf(s1) != getLeaf(s2)) {
                return false;
            }
        }
        return s1.isEmpty() && s2.isEmpty();
    }

    public int getLeaf(Stack<TreeNode> s) {
        while(true) {
            TreeNode t = s.pop();
            if(t.left == null && t.right == null) {
                return t.val;
            }
            if(t.right != null) {
                s.push(t.right);
            }
            if(t.left != null) {
                s.push(t.left);
            }
        }
    }
}