请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
举个例子,如上图所示,给定一颗叶值序列为 (6, 7, 4, 9, 8)
的树。
如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。
如果给定的两个头结点分别为 root1
和 root2
的树是叶相似的,则返回 true
;否则返回 false
。
提示:
- 给定的两颗树可能会有
1
到100
个结点。
思路:如果这道题把所有的节点按照左到右的叶子结点保存到数组中,然后挨个比,那么这道题没什么难度,用后序遍历判断左右节点为空才加入res的方法可以取出叶节点,然后逐个比较就行了。现在要介绍的是通过栈来实现每次取出一个叶节点进行比较。在后序遍历中,我们可以用栈来进行迭代操作进行后序遍历(左右根),那么还是按照后序遍历的主体思路遍历这棵树,只不过当遇到叶节点时我们需要把他的值返回回来,即我们的后序遍历变成通过dfs函数返回遍历到的每一个叶节点,那么通过控制dfs函数每次返回叶节点的值就可以实现逐个比较叶节点。
参考代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int dfs(stack<TreeNode*> &s) {
while (true) {
TreeNode* node = s.top(); s.pop();
if (node->right) s.push(node->right);
if (node->left) s.push(node->left);
if (!node->left && !node->right) return node->val;
}
}
bool leafSimilar(TreeNode* root1, TreeNode* root2) {
stack<TreeNode*> s1, s2;
s1.push(root1); s2.push(root2);
while (!s1.empty() && !s2.empty()) {
if (dfs(s1) != dfs(s2)) return false;
}
return s1.empty() && s2.empty();
}
};