学习笔记-【对称二叉树】小小变化,大有洞天


前言

对称二叉树是二叉树中的基础问题,下面我们从递归和迭代的角度解决它。


题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。
例如:对称二叉树

详情可见leetcode 101.对称二叉树

一、递归法

通过对称二叉树的定义,我们可以看到,将每三层二叉树看作一个部分观察,可以分为外侧和内侧。外侧的两个节点的值对应相等,内侧的两个节点的值对应相等,依次判断即可。当出现left,right为空指针时,或者left和right对应的值不相等,则返回false。否则返回true。
我们从递归三要素分析:

递归三要素

调用参数和返回值
终止情况
递归逻辑

  1. 首先,依据题意,我们需要返回一个bool类型的数据。至于参数,我们递归时是对二叉树的两个子树进行递归,所以我们选择两个指针TreeNode* left, TreeNode* right。
  2. 关于终止情况,我们分析时发现有四种情况可以直接返回结果:

left != NULL && right == NULL
left == NULL && right != NULL
left == NULL && right == NULL
left->val != right->val

  1. 递归逻辑:对于图示的结构,判断其外侧节点的值是否相等,判断其内测节点的值是否相等。返回 outside&&inside

代码如下:

 //递归法
 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);

     return outside && inside;
 }
 bool isSymmetric1(TreeNode* root) {
     if (root == NULL) return true;
     return compare(root->left, root->right);
 }

二、迭代法

1.使用队列

队列先进先出
我们用队列模拟一下实例:

队列模拟过程

 //用队列迭代
 bool isSymmetric2(TreeNode* root) {
     if (root == NULL) return true;
     queue <TreeNode*> que;
     que.emplace(root->left);
     que.emplace(root->right);
     while (!que.empty()) {
         TreeNode* leftNode = que.front(); que.pop();
         TreeNode* rightNode = que.front(); que.pop();
         if (leftNode == NULL && rightNode == NULL) continue;
         if (leftNode != NULL && right == NULL || leftNode == NULL && right != NULL || leftNode->val != rightNode->val) return false;
         que.emplace(leftNode->left);
         que.emplace(rightNode->right);
         que.emplace(leftNode->right);
         que.emplace(rightNode->left);
     }
     return true;
 }

2.使用栈

用栈写的代码看上去只是把queue改成了stack,其实底层逻辑并不相同。
栈是先进后出的,我们用栈来模拟一下:
用栈模拟

 //用栈迭代
 bool isSymmetric3(TreeNode* root) {
     if (root == NULL) return true;
     stack <TreeNode*> st;
     st.emplace(root->left);
     st.emplace(root->right);
     while (!st.empty()) {
         TreeNode* leftNode = st.top(); st.pop();
         TreeNode* rightNode =st.top(); st.pop();
         if (leftNode == NULL && rightNode == NULL) continue;
         if (leftNode != NULL && right == NULL || leftNode == NULL && right != NULL || leftNode->val != rightNode->val) return false;
         st.emplace(leftNode->left);
         st.emplace(rightNode->right);
         st.emplace(leftNode->right);
         st.emplace(rightNode->left);
     }
     return true;
 }

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值