一:题目
二:上码
方法一:队列
/**
* 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 我看不懂 无奈 递归的码看起来是那么的小巧玲珑 但理解费劲 哎呀呀呀呀呀呀
递归要我命