请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
举个例子,如上图所示,给定一颗叶值序列为 (6, 7, 4, 9, 8)
的树。
如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。
如果给定的两个头结点分别为 root1
和 root2
的树是叶相似的,则返回 true
;否则返回 false
。
提示:
- 给定的两颗树可能会有
1
到100
个结点。
这题递归找到叶子节点,不过在比较的时候,最好是动态的比较,即查找到一个不相同的叶子节点就false,但这题好像是做不到的,怎么说呢,2棵树没有同步性的判断把
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
if(root1==null && root2==null)
return true;
if(root1==null || root2==null)
return false;
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
f(root1, list1);
f(root2, list2);
if(list1.size()!=list2.size())
return false;
for(int i=0;i<list1.size();i++)
if(list1.get(i)!=list2.get(i))
return false;
return true;
}
static void f(TreeNode root, ArrayList<Integer> list) {
if(root==null)
return;
if(root.left==null && root.right==null)
list.add(root.val);
f(root.left, list);
f(root.right, list);
}
看到过瘾系列
class Solution {
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
List<Integer> leaves1 = new ArrayList();
List<Integer> leaves2 = new ArrayList();
dfs(root1, leaves1);
dfs(root2, leaves2);
return leaves1.equals(leaves2);
}
public void dfs(TreeNode node, List<Integer> leafValues) {
if (node != null) {
if (node.left == null && node.right == null)
leafValues.add(node.val);
dfs(node.left, leafValues);
dfs(node.right, leafValues);
}
}
}
class Solution {
public:
bool leafSimilar(TreeNode* root1, TreeNode* root2) {
vector<int> leaves1;
vector<int> leaves2;
dfs(root1, leaves1);
dfs(root2, leaves2);
return leaves1 == leaves2;
}
void dfs(TreeNode* node, vector<int>& leaves) {
if (node == NULL) return;
if (node->left == NULL && node->right == NULL)
leaves.push_back(node->val);
dfs(node->left, leaves);
dfs(node->right, leaves);
}
};