一:解题思路
这道题目与判断二叉树是否相等基本上是一模一样的。有2种解法,第一种:递归法。第二种:迭代法。
二:完整代码示例 (C++版和Java版)
递归版C++:
class Solution { public: bool isSymmetricRecursive(TreeNode* left, TreeNode* right) { if (left == NULL && right == NULL) return true; if (left == NULL || right == NULL) return false; return (left->val==right->val) && (isSymmetricRecursive(left->left,right->right)) && (isSymmetricRecursive(left->right,right->left)); } bool isSymmetric(TreeNode* root) { if (root == NULL) return true; return isSymmetricRecursive(root->left,root->right); } };
Java递归版:
class Solution { public boolean isSymmetricRecursive(TreeNode left,TreeNode right) { if((left==null)&&(right==null)) return true; if((left==null)||(right==null)) return false; return (left.val==right.val)&& (isSymmetricRecursive(left.left,right.right))&& (isSymmetricRecursive(left.right,right.left)); } public boolean isSymmetric(TreeNode root) { if(root==null) return true; return isSymmetricRecursive(root.left,root.right); } }
迭代版C++:
class Solution { public: bool isSymmetric(TreeNode* root) { if (root == NULL) return true; stack<TreeNode*> stack; stack.push(root->left); stack.push(root->right); while (!stack.empty()) { TreeNode* s = stack.top(); stack.pop(); TreeNode* t = stack.top(); stack.pop(); if ((s == NULL) && (t == NULL)) continue; if ((s == NULL) || (t == NULL)) return false; if (s->val != t->val) return false; stack.push(s->left); stack.push(t->right); stack.push(s->right); stack.push(t->left); } return true; } };
Java迭代版:
class Solution { public boolean isSymmetric(TreeNode root) { if(root==null) return true; Stack<TreeNode> stack=new Stack<>(); stack.push(root.left); stack.push(root.right); while(!stack.empty()) { TreeNode s=stack.pop(); TreeNode t=stack.pop(); if((s==null)&&(t==null)) continue; if((s==null)||(t==null)) return false; if(s.val!=t.val) return false; stack.push(s.left); stack.push(t.right); stack.push(s.right); stack.push(t.left); } return true; } }