Question: Write a function to test if two binary trees are equal. The trees are equal only if the values are equal and also the structures are equal.
Equal trees
89 89
12 100 12 100
2 2
Not equal trees
89 89
2 100 12 100
12 2
First thing which comes to our mind is just write
if nd1->val !=nd2->val, trees are not equal.
OK. That is correct. But then what? What do we compare next? Value of left child? Or value of right child?
Like all other operations of binary tree, this function also needs recursion.
After ensuring that nd1->val and nd2->val are equal, we have to call this function on left child and right child. And only if both of these calls return 1, the trees are equal.
So here are the steps
If both nd1 and nd2 are equal, then they are leaf nodes and hence we must return true. As long as both are having same values in subtrees, l&&r will be 1 (which is true in C).Equal trees
89 89
12 100 12 100
2 2
Not equal trees
89 89
2 100 12 100
12 2
First thing which comes to our mind is just write
if nd1->val !=nd2->val, trees are not equal.
OK. That is correct. But then what? What do we compare next? Value of left child? Or value of right child?
Like all other operations of binary tree, this function also needs recursion.
After ensuring that nd1->val and nd2->val are equal, we have to call this function on left child and right child. And only if both of these calls return 1, the trees are equal.
So here are the steps
- If nodes of two trees nd1 and nd2 are not null
- If values of nodes are not equal return false
- If not,
- l = return value of function called for left children of nd1 and nd2
- r = return value of function for right children of nd1 and nd2
- return l && r
- Now if both are NULL return true
But if there is a non-matching node somewhere, then the function returns false, which is propagated up the stack.
Let us write the function.
int equal_trees(NODEPTR nd1,NODEPTR nd2) { if(nd1==nd2) return 1;//both are null if(nd1!=NULL ){ if(nd2==NULL) return 0; if(nd1->val!=nd2->val) return 0; else { int l= equal_trees(nd1->left,nd2->left); int r = equal_trees(nd1->right,nd2->right); return l&r; } } if(nd2!=NULL && nd1==NULL) return 0; }
Comments
Post a Comment