101.给定一个二叉树,检查它是否是镜像对称的。
- 本来还想着这个题要用什么遍历去遍历二叉树,但是想来想去觉得都不合适。看了题解才恍然大悟,只需要将二叉树分为内侧和外侧,递归地比较内侧和外侧的节点相不相同就可以了。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//用于比较二叉树的内侧和外侧是否对称
bool compare(struct TreeNode* left, struct TreeNode* right) {
if (left == NULL && right == NULL)
return true;
else if (left != NULL && right == NULL)
return false;
else if (left == NULL && right != NULL)
return false;
else if (left->val != right->val)
return false;
bool inside = compare(left->right, right->left);
bool outside = compare(left->left, right->right);
return inside && outside;
}
bool isSymmetric(struct TreeNode* root){
if (!root)
return true;
return compare(root->left, root->right);
}
- 另一种解法是迭代法,也就是非递归法,利用队列每次比较外侧两个节点或内侧两个节点是否相同,如果相同的话再入队它们的孩子节点,入队顺序要满足两个同时是外侧结点或两个同时是内侧结点。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSymmetric(struct TreeNode* root){
if (!root)
return true;
struct TreeNode* queue[2000];
int front = 0, rear = 0;
queue[rear] = root->left;
queue[++rear] = root->right;
while (front <= rear) {
struct TreeNode* left = queue[front++];
struct TreeNode* right = queue[front++];
if (left == NULL && right == NULL)
continue;
if (left == NULL || right == NULL || left->val != right->val)
return false;
queue[++rear] = left->left;
queue[++rear] = right->right;
queue[++rear] = left->right;
queue[++rear] = right->left;
}
return true;
}
这里的队列其实只是充当了一个容器而已,把队列改成栈一样可行。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSymmetric(struct TreeNode* root){
if (!root)
return true;
struct TreeNode* stack[2000];
int top = -1;
stack[++top] = root->right;
stack[++top] = root->left;
while (top != -1 ) {
struct TreeNode* left = stack[top--];
struct TreeNode* right = stack[top--];
if (left == NULL && right == NULL)
continue;
if (left == NULL || right == NULL || left->val != right->val)
return false;
stack[++top] = right->right;
stack[++top] = left->left;
stack[++top] = right->left;
stack[++top] = left->right;
}
return true;
}