【Leetcode:872】 Leaf-Similar Trees ——java实现

872. Leaf-Similar Trees

问题描述

请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个叶值序列 。
这里写图片描述
举个例子,如上图所示,给定一颗叶值序列为 (6, 7, 4, 9, 8) 的树。

如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。

如果给定的两个头结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。

提示:

  • 给定的两颗树可能会有 1 到 100 个结点。

问题分析

本题要求两棵树的叶节点值组成的序列是不是相同,其本质是输出二叉树的所有叶节点。对于二叉树叶节点的输出,就涉及到二叉树的深度优先遍历。
二叉树深度优先遍历有递归和非递归两种形式,非递归就涉及到栈结构。

代码实现

方法一:递归实现

  public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        dfsTra(list1, root1);
        dfsTra(list2, root2);
        return list1.equals(list2);
    }

    private void dfsTra(List<Integer> list, TreeNode root) {
        if (root != null) {           //basecase
            if (root.left == null && root.right == null) {
                list.add(root.val);
            }
            dfsTra(list, root.left);  //递归用到递归栈
            dfsTra(list, root.right);
        }
    }

方法二:非递归实现

    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        dfsTra(list1, root1);
        dfsTra(list2, root2);
        return list1.equals(list2);
    }
    private void dfsTra(List<Integer> list, TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        stack.push(cur);
        while (!stack.isEmpty()) {
            cur = stack.pop();
            if (cur.right != null) {       //考虑到栈先进后出
                stack.push(cur.right);
            }
            if (cur.left != null){
                stack.push(cur.left);
            }
            if (cur.left == null && cur.right == null) {
                list.add(cur.val);
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/GZY_BUPT/article/details/81485464
今日推荐