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);
}
}
}