题目描述:
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3]
is symmetric:
1 2 3 4 5 6 1 / \ 2 2 / \ / \ 3 4 4 3
But the following [1,2,2,null,3,null,3]
is not:
Note:
Bonus points if you could solve it both recursively and iteratively.
最直观的方法就是先把二叉树翻转, 然后再判断两棵二叉树是否相同.
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 48 49 50 51 52 53 class Solution {public : void copyTree (TreeNode* root, TreeNode *copy) { if (!root){ return ; } if (root->left) copy->left = new TreeNode(root->left->val); else copy->left = NULL ; copyTree(root->left, copy->left); if (root->right) copy->right = new TreeNode(root->right->val); else copy->right = NULL ; copyTree(root->right, copy->right); } void reverseTree (TreeNode *root) { if (!root) return ; TreeNode *tmp = root->left; root->left = root->right; root->right = tmp; reverseTree(root->left); reverseTree(root->right); } bool sameTree (TreeNode* root1, TreeNode* root2) { if (root1 == NULL && root2 == NULL ) return true ; if (root1 == NULL || root2 == NULL ) return false ; if (root1->val != root2->val) return false ; return sameTree(root1->left, root2->left) && sameTree(root1->right, root2->right); } bool isSymmetric (TreeNode* root) { if (!root) return true ; TreeNode *mirrorRoot = new TreeNode(root->val); copyTree(root, mirrorRoot); reverseTree(mirrorRoot); return sameTree(root, mirrorRoot); } };
非递归的方法就是使用迭代而不是递归来分别从不同的方向 遍历左右子树, 注意 , 不能用先序遍历或者后序遍历, 比如这组数据[1,2,2,null,3,null,3]
使用先序遍历它的左右子树是互为镜像的.
另外说一句, 直到这里我才去看非递归遍历二叉树的标准方法, 我以前都是用另一个栈来保存节点状态…很有力地证明了我的数据结构课听得很水= =.
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 48 49 50 class Solution {public : bool isSymmetric (TreeNode* root) { if (!root) return true ; return isMirror(root->left, root->right); } bool isMirror (TreeNode* left, TreeNode *right) { stack <TreeNode*> leftPath, rightPath; while ((!leftPath.empty() || left != nullptr ) && (!rightPath.empty() || right != nullptr )){ TreeNode *curLeftNode = nullptr , *curRightNode = nullptr ; if (left != nullptr ){ leftPath.push(left); left = left->left; } else { left = leftPath.top(); curLeftNode = left; leftPath.pop(); left = left->right; } if (right != nullptr ){ rightPath.push(right); right = right->right; } else { right = rightPath.top(); curRightNode = right; rightPath.pop(); right = right->left; } if ((curLeftNode && curRightNode && curLeftNode->val != curRightNode->val) || (!(curLeftNode && curRightNode) && !(curLeftNode == nullptr && curRightNode == nullptr ))) { return false ; } } if (leftPath.empty() && left == nullptr && rightPath.empty() && right == nullptr ) return true ; else return false ; } };
附上标准的非递归遍历方法:
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 48 49 50 51 52 53 54 55 56 57 58 59 void preOrderIter (struct node *root) { stack <struct node *> s; while (root != NULL || !s.empty()) { if (root != NULL ) { cout << root->data << " " ; s.push(root); root = root->left; } else { root = s.top(); s.pop(); root = root->right; } } cout << endl ; } void inOrderIter (struct node *root) { stack <struct node *> s; while (root != NULL || !s.empty()) { if (root != NULL ) { s.push(root); root = root->left; } else { root = s.top(); cout << root->data << " " ; s.pop(); root = root->right; } } cout << endl ; } void postOrderIter (struct node *root) { if (!root) return ; stack <struct node*> s, output; s.push(root); while (!s.empty()) { struct node *curr = s .top (); output.push(curr); s.pop(); if (curr->left) s.push(curr->left); if (curr->right) s.push(curr->right); } while (!output.empty()) { cout << output.top()->data << " " ; output.pop(); } cout << endl ; }