101. Symmetric Tree (Tree, Queue; DFS, WFS)
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
思路:要等到左儿子和右儿子的结果都知道了,才能判断当前节点的对称性,所以是后序遍历
法I:递归,先判断两个节点自身是否相等,如果相等再判断左、有儿子 => 前序遍历
class Solution { public: bool isSymmetric(TreeNode *root) { if(!root) return true; bool result; if((root->left==NULL && root->right != NULL) ||(root->left!=NULL && root->right == NULL)) { return false; } else if(root->left == NULL && root->right == NULL) { return true; } else { result = cmp(root->left, root->right); } } bool cmp(TreeNode * node1, TreeNode* node2) { int result1 = true; int result2 = true; if(node1->val!=node2->val) return false; else { //递归结束条件:至少有一个节点为NULL if((node1->left==NULL && node2->right != NULL) || (node1->left!=NULL && node2->right == NULL)|| (node1->right!=NULL && node2->left == NULL)|| (node1->right==NULL && node2->left != NULL)) { return false; } if((node1->left == NULL && node2->right == NULL)&& (node1->right == NULL && node2->left== NULL)) { return true; } //互相比较的两个点,要比较节点1的左儿子和节点2的右儿子,以及节点1的右儿子和节点2的左儿子 if(node1->left != NULL) { result1 = cmp(node1->left,node2->right); } if(node1->right != NULL) { result2 = cmp(node1->right,node2->left); } return (result1 && result2); } } };
法II:用队列实现层次遍历(层次遍历总是用队列来实现)
class Solution { public: bool isSymmetric(TreeNode *root) { if(root == NULL) return true; queue<TreeNode*> q; q.push(root->left); q.push(root->right); TreeNode *t1, *t2; while(!q.empty()){ t1 = q.front(); q.pop(); t2 = q.front(); q.pop(); if(t1 == NULL && t2 == NULL) continue; if(t1 == NULL || t2 == NULL || t1->val != t2->val) return false; q.push(t1->left); q.push(t2->right); q.push(t1->right); q.push(t2->left); } return true; } };