【代码随想录day 14】 力扣 101. 对称二叉树
视频讲解:https://www.bilibili.com/video/BV1ue4y1Y7Mf/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E6%80%9D%E8%B7%AF
力扣题目:https://leetcode.cn/problems/symmetric-tree/
这道题主要是使用递归的思想,先枚举可能发生的情况
- 左空右不空 F
- 左不空右空 F
- 左空右空 T
- 左不等于右 F
后续则是左右两节点存在且相等,因为是对称二叉树,我们要比较左右节点的外侧,也就是left的left和right的right;在比较内侧是否一直,也就是left的right和right的left。
要注意的是,这道题只能用后序遍历,即左右中的方法。因为我先要判断子节点是否对称再向父节点返回true or false,再去遍历其他的节点。
/*** 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 compare(TreeNode* left, TreeNode* right) {//排除空节点情况//左空右不空if(left==NULL && right!=NULL) return false;//左不空右空else if(left !=NULL && right ==NULL) return false;//左空右空else if(left==NULL && right==NULL) return true;//左不等于右else if(left->val!= right->val) return false;//左等于右,向下递归bool outside = compare(left->left,right->right);bool inside = compare(left->right,right->left);bool result = outside &&inside;return result;}bool isSymmetric(TreeNode* root) {if (root == NULL) return true;return compare(root->left, root->right);}
};
举个例子:
1/ \2 2/ \ / \3 4 4 3/ \ / \ / \5 6 7 7 6 5
运行过程如下:
compare(2, 2)
├── compare(3, 3)
│ ├── compare(5, 5) ✅
│ └── compare(6, 6) ✅
├── compare(4, 4)
│ ├── compare(7, 7) ✅
│ └── compare(NULL, NULL) ✅
└── 所有都为 true → 返回 true
还有一种方法是使用队列一层一层来遍历,判断是否相等:
class Solution {
public:bool isSymmetric(TreeNode* root) {if (root == NULL) return true;queue<TreeNode*> que;que.push(root->left); // 将左子树头结点加入队列que.push(root->right); // 将右子树头结点加入队列while (!que.empty()) { // 接下来就要判断这两个树是否相互翻转TreeNode* leftNode = que.front(); que.pop();TreeNode* rightNode = que.front(); que.pop();if (!leftNode && !rightNode) { // 左节点为空、右节点为空,此时说明是对称的continue;}// 左右一个节点不为空,或者都不为空但数值不相同,返回falseif ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {return false;}que.push(leftNode->left); // 加入左节点左孩子que.push(rightNode->right); // 加入右节点右孩子que.push(leftNode->right); // 加入左节点右孩子que.push(rightNode->left); // 加入右节点左孩子}return true;}
};
假设树为这样:
1/ \2 2/ \ / \3 4 4 3
每一层的遍历如下所示:
1
22
3344
每次弹出前两个元素比较值是否相等,即可判断整个树的对称性。