zoukankan      html  css  js  c++  java
  • 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.

    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);
                }
            }
        }
    }
  • 相关阅读:
    提高CRM系统实施成功率
    CRM销售管理软件实施的误区
    ERP、CRM、SCM之间的区别
    选择CRM系统的四个步骤
    [导入]163相册验证码图片的识别手记之一 去除干扰
    [导入]C#中WebService里的回车符"\r"丢失问题
    [导入]文件同步精灵(初版)
    [导入]163相册验证码图片的识别手记之二 识别
    [导入]电信对我们的侵权行为如何能得到法律保护?
    [导入]认父亲的DbParameter!!
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10198574.html
Copyright © 2011-2022 走看看