Cover image for Classic 150 Interview Questions P101 Symmetric Binary Tree

Classic 150 Interview Questions P101 Symmetric Binary Tree


Timeline

Timeline

2025-10-23

init

Binary Tree

Problem:

Recursion, symmetric comparison

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
struct TreeNode {	int val;	TreeNode *left;	TreeNode *right;	TreeNode()		: val(0)		, left(nullptr)		, right(nullptr)	{	}	TreeNode(int x)		: val(x)		, left(nullptr)		, right(nullptr)	{	}	TreeNode(int x, TreeNode *left, TreeNode *right)		: val(x)		, left(left)		, right(right)	{	}};class Solution {    public:	bool isSame(TreeNode *left, TreeNode *right)	{		if (left != nullptr && right != nullptr &&		    right->val == left->val) {			return isSame(left->right, right->left) &&			       isSame(left->left, right->right);		} else if (left == nullptr && right == nullptr) {			return true;		} else {			return false;		}	}	bool isSymmetric(TreeNode *root)	{		if (root == nullptr) {			return true;		}		return isSame(root->left, root->right);	}};

Non-recursive approach, iterative, enqueue nodes twice

12345678910111213141516171819202122232425262728293031323334
#include <queue>using std::queue;class Solution {public:    bool isSymmetric(TreeNode* root) {	TreeNode *left, *right;        if (root == nullptr) return true;        queue<TreeNode*> que;        que.push(root->left);        que.push(root->right);        while (!que.empty()) {            left = que.front();            que.pop();            right = que.front();            que.pop();            if (left == nullptr && right == nullptr) continue;            if (left == nullptr || right == nullptr) return false;            if (left->val != right->val) return false;            // Note the symmetric enqueue order here            que.push(left->left);            que.push(right->right);            que.push(left->right);            que.push(right->left);        }        return true;    }};

leetcode hot 100 rewrite

1234567891011121314151617181920212223
class Solution {    private:        bool isSame(TreeNode *p, TreeNode *q)        {                if ((p && !q) || (!p && q))                        return false;                if (!p && !q)                        return true;                if (p->val == q->val)                        return isSame(p->left, q->right) && isSame(p->right, q->left);                else                        return false;        }    public:        bool isSymmetric(TreeNode *root)        {                // root is not null                return isSame(root->left, root->right);        }};
Loading comments…