Timeline binary tree Problem:
Recursion, symmetric comparison
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 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, iteration, enqueue nodes twice
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #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 ; que.push (left->left); que.push (right->right); que.push (left->right); que.push (right->left); } return true ; } };
leetcode hot 100 rewrite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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) { return isSame (root->left, root->right); } };