Introduction
Question:判断二叉树是否对称
Analysis
一开始想复杂了,还以为一颗对称的树,其子树也需要满足对称(不过这样是不是还更好做一点)。这道题想起来并不复杂,可能在实现迭代版本的时候会略微有些繁琐。
其实只需要同时对两颗子树同时进行先序遍历即可,左子树执行正常的先序遍历,右子树执行先访问右子树再访问左子树的先序遍历。然后再遍历时做好判断即可。由于先序遍历实现迭代版本也不复杂,只需要借助一个栈即可。
Implement
递归版本
1 2 3 4 5 6 7 8 9 10
| bool isSymmetric(TreeNode* left, TreeNode *right) { if (left == nullptr && right == nullptr) return true; else if (left && right && left->val == right->val) { return isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left); } else return false; } bool isSymmetric(TreeNode* root) { return root == nullptr || isSymmetric(root->left, root->right); }
|
迭代版本
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
| bool isSymmetric(TreeNode* root) { if (root == nullptr) return true; TreeNode *left, *right; left = root->left; right = root->right; if ((left && !right) || (!left && right)) return false; stack<TreeNode*> stLeft, stRight; while ((left && right) || (!stLeft.empty() && !stRight.empty())) { if ((left && !right) || (!left && right)) return false; else if (left && right) { if (left->val != right->val) return false; stLeft.push(left->right); stRight.push(right->left); left = left->left; right = right->right; } else { left = stLeft.top(); stLeft.pop(); right = stRight.top(); stRight.pop(); } } return true; }
|
One More Thing