目录
前言
真的代码能力太弱了,得打打题磨练一下,就从力扣开始刷刷看吧!
正文
题目描述
#101 对称二叉树
给你一个二叉树的根节点
root
, 检查它是否轴对称。示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false提示:
- 树中节点数目在范围
[1, 1000]
内-100 <= Node.val <= 100
笔者解法
注意到,当使用前序遍历将两颗树存入队列中时,如果两棵树轴对称,那么遍历出来的队列相等;
注意,“前序遍历” 原本指在遍历二叉树时,先访问节点的值,然后访问左子叶的值,最后访问右子叶的值,也就是先左在右,左边没有遍历完绝不动右边;此处对 “前序遍历” 的概念进行了扩展,在对左子树进行遍历时,先左再右;对右子树进行遍历时,先右再左;
可以发现,使用先左再右的 “前序遍历” 遍历左子树 和 先右再左的 “前序遍历” 遍历右子树后得到的子树队列应该是相同的;
遍历使用了递归思想。
注意,当访问到节点为空时,不能立即返回,应该先将空节点的数值也存进队列中占位,此处使用超过 “-100 <= Node.val <= 100
” 范围的 101 作为空节点的值;如果空节点不入队列占位,则当输入的二叉树如示例二所给的偏向一边的、已经退化成链表的二叉树时,判断将会出错,此时该二叉树明显不轴对称,但是左右子树序列是相同的。
/**
* 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 {
queue<int> leftTree, rightTree; //分别存储在根的两侧的两棵树
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
preOrder_FirstLeft(root->left);
preOrder_FirstRight(root->right);
if(leftTree == rightTree) return true; //判断两棵树遍历而成的队列是否相等
else return false;
}
//用前序遍历遍历左树,存到 leftTree 队列中
void preOrder_FirstLeft(TreeNode* root){
if(!root){
//当前节点为空时,存入 101,因为题目中 “-100 <= Node.val <= 100”
leftTree.push(101);
return;
}
leftTree.push(root->val);
preOrder_FirstLeft(root->left);
preOrder_FirstLeft(root->right);
}
//用前序遍历遍历右树,存到 leftTree 队列中
void preOrder_FirstRight(TreeNode* root){
if(!root){
rightTree.push(101);
return;
}
rightTree.push(root->val);
preOrder_FirstRight(root->right);
preOrder_FirstRight(root->left);
}
};
其他解法
待讨论后记录。
后记
共勉!
纪念LeetCode俱乐部成立不到 24 小时~