Binary Tree     C++     Depth-First Search     Easy     Iterator     Tree    

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