Leaf-Similar Trees - Leaf Iterator
Problem Statement:
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.
Example 1:
Input: root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8] Output: true
Example 2:
Input: root1 = [1,2,3], root2 = [1,3,2] Output: false
Constraints:
- The number of nodes in each tree will be in the range
[1, 200]
. - Both of the given trees will have values in the range
[0, 200]
.
Solution:
Hopefully you have already solved this problem by DFS or BFS method. I will not go there. I think this could be a new unseen problem to create a LeafIterator
that returns the next leaf node value. A similar problem is BSTIterator
present here. This could be a medium problem.
We use a similar method to build LeafIterator
and we are able to do it in O(h)
space where h
equals the height of tree. The only change is that instead of the next inorder traversal value we return only if the current node is a leaf node. We will have to separately handle the case when the inorder traversal does not end at a leaf node and we will return -1
in that case. Return value of -1 from next()
indicates that there are no more nodes similar to hasNext()
returning false
.
class LeafIterator
{public:
stack<TreeNode*> stk;
LeafIterator(TreeNode *root)
{
goLeft(root);
}
int next()
{
if (!hasNext()) return -1;
TreeNode* cur = stk.top();
stk.pop();
if(cur->right!=NULL) goLeft(cur->right);
if (!cur->left && !cur->right) return cur->val;
return next();
}
bool hasNext()
{
return !stk.empty();
}
void goLeft(TreeNode* root)
{
while(root)
{
stk.push(root);
root = root->left;
}
}
};
class Solution {
public:
bool leafSimilar(TreeNode* root1, TreeNode* root2)
{
LeafIterator leafy1(root1), leafy2(root2);
while(leafy1.hasNext() && leafy2.hasNext())
{
int a = leafy1.next(), b = leafy2.next();
// cout<<a<<','<<b<<endl;
if(a!=b) return false;
}
bool a = !leafy1.hasNext() || leafy1.next()==-1;
bool b = !leafy2.hasNext() || leafy2.next()==-1;
return (a&b);
}
};