一:题目
二:上码
方法一:队列
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSymmetric(TreeNode* root) {if(root == NULL) return true;queue<TreeNode*> q;q.push(root->left);q.push(root->right);while(!q.empty()){//注意这里我们不能 q.empty() != NULL 因为我们在队列中也装入了空指针//比较我们的装入队列的两个结点(指针)TreeNode* leftroot = q.front();q.pop();//访问完一个删除一个TreeNode* rightroot = q.front();q.pop();if(leftroot == NULL && rightroot == NULL)//递归到根节点的时候 直接跳过 去遍历下一组数据continue;if(leftroot == NULL && rightroot != NULL)return false;if(rightroot == NULL && leftroot != NULL)return false;if(rightroot != NULL && leftroot != NULL && (rightroot->val != leftroot->val))return false;//下面的意思就是 装入队列的结点的顺序 下次遍历 做准备q.push(leftroot->left);//装入左子树左节点q.push(rightroot->right);//装入右子树右结点q.push(leftroot->right);//装入左子树右节点q.push(rightroot->left);//装入右子树左节点 }return true;}
};
第二种方法 栈
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSymmetric(TreeNode* root) {/**思路:这里我们考虑用栈,我们首次入栈的时候,我们将根节点的左右孩子节点入栈然后我们就开始在while循环中,开始出栈比较,并且入栈的是(每个左节点的右孩子,右节点的左孩子)(每个左节点的左孩子,右节点的有孩子)我们通过出栈比较 如果有特殊情况 则返回fasle 否则就是true**/if(root == NULL) return false;stack<TreeNode*>st;st.push(root->left);//这里在push的时候不用考虑是否为NULL,因为我们需要比较两个节点st.push(root->right);while(!st.empty()) {TreeNode* rightNode = st.top(); st.pop();TreeNode* leftNode = st.top(); st.pop();if(!rightNode && !leftNode) {//如果左右节点为NULL的话,那就跳过,去比较下一组节点continue;}//那么接下来就是左节点为空,右节点不空//左节点不空,右节点为空//左右节点均不为空 但是数值不相等if((!rightNode || !leftNode || (rightNode->val != leftNode->val)))return false;st.push(leftNode->left);st.push(rightNode->right);st.push(leftNode->right);st.push(rightNode->left);}return true;}
};
其实还有递归的做法 emmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 我看不懂 无奈 递归的码看起来是那么的小巧玲珑 但理解费劲 哎呀呀呀呀呀呀
递归要我命