持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
一、题目
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) { }
};
bool isMirror(TreeNode* root) {
}
int main(int, char**)
{
TreeNode root(1);
TreeNode node1(2);
TreeNode node2(3);
TreeNode node3(4);
TreeNode node4(2);
TreeNode node5(4);
TreeNode node6(3);
root.left = &node1;
root.right = &node4;
node1.left = &node2;
node1.right = &node3;
node4.left = &node5;
node4.right = &node5;
cout << (isMirror(&root) ? "是镜像" : "不是镜像") << endl;
return 0;
}
二、分析
根据题意可知,判断二叉树是否是镜像,难点在于左右对应关系不好遍历。
并且在迭代的时候,对应关系一直在变化,如果没有掌握好,就很可能出现对应出错的情况。
不过仔细观察题图可知,所谓镜像,其实就是左节点和右节点相比,每一层皆是如此,左节点的左子节点等于右节点的右子节点,所以只需要再遍历的时候,将左右节点进行交叉递归比较,就能达到目的。
同时也要注意判空,如果两个都为空,也是属于相等的情况,叶子节点的左右节点相比就是这个情况,判空也是作为递归的退出条件。
三、模拟
- 1->左节点 == 1->右节点
- 1->左节点->左节点 == 1->右节点->右节点 并且 1->左节点->右节点 == 1->右节点->左节点
- 剩下的节点都为空,退出递归
四、实现
bool dfs(TreeNode* left, TreeNode* right){
if(!left && !right) return true;
if(!left || !right || left->val != right->val) return false;
return dfs(left->left, right->right) && dfs(left->right, right->left);
}
bool isMirror(TreeNode* root) {
return dfs(root, root);
}
五、结言
镜像二叉树的解题关键在于观察,掌握规律,便能迎刃而解。
镜像二叉树在实际应用中经常遇到,比如做对比差异校验时非常有用,虽然算法很简单,但是能解决问题的算法都是值得好好掌握的,往往有些时候,越简单的算法,反而能解决大问题。
创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!