每日一算法题-镜像树

103 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

一、题目

image.png

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->右节点
  2. 1->左节点->左节点 == 1->右节点->右节点 并且 1->左节点->右节点 == 1->右节点->左节点
  3. 剩下的节点都为空,退出递归

四、实现

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);
}

五、结言

镜像二叉树的解题关键在于观察,掌握规律,便能迎刃而解。
镜像二叉树在实际应用中经常遇到,比如做对比差异校验时非常有用,虽然算法很简单,但是能解决问题的算法都是值得好好掌握的,往往有些时候,越简单的算法,反而能解决大问题。

创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!