101. Symmetric Tree

来源:互联网 发布:嗟乎,此真将军矣 编辑:程序博客网 时间:2024/06/06 08:33

题目:Symmetric Tree

题目叙述

原题链接:https://leetcode.com/problems/symmetric-tree/#/description
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:

这里写图片描述

But the following [1,2,2,null,3,null,3] is not:

这里写图片描述

给出一个二叉树,判断它是不是自己的镜像(即按照中间对称)。

思路

递归写法

先判断节点是不是空,然后分别判断左子树的左和右子树的右是否相等,以及左子树的右和右子树的左孩子是否相等。

参考代码

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool isSymmetric(TreeNode* root) {        if(!root) return true;        return isOk(root->left, root->right);    }private:    bool isOk(TreeNode* left, TreeNode* right) {        if(!left && !right) return true;        if(left == NULL) return false;        if(right == NULL) return false;        return (left->val == right->val) && isOk(left->left, right->right) && isOk(left->right, right->left);    }};

非递归写法

用两个队列分别层序遍历二叉树,一个从左到右遍历,一个从右到左遍历,每次判断两个队列中的当前节点q1, q2, 判断q1和q2的值是否相等,判断q1和q2是不是同时有镜相对称的子树.

参考代码

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool isSymmetric(TreeNode* root) {        if(!root) return true;        queue<TreeNode*> qL;        queue<TreeNode*> qR;        qL.push(root);        qR.push(root);        while(!qL.empty() && !qR.empty()) {            TreeNode* frontL = qL.front();            TreeNode* frontR = qR.front();            qL.pop(), qR.pop();            if(frontL->val != frontR->val) return false;            if((frontL->left && !frontR->right) || (frontL->right && !frontR->left)) return false;            if(frontL->left && frontR->right) {                qL.push(frontL->left);                qR.push(frontR->right);            }            if(frontL->right && frontR->left) {                qL.push(frontL->right);                qR.push(frontR->left);            }        }        return true;    }};
0 0