代码随想录算法训练营第十五天| 层序遍历 ● 226.翻转二叉树 ● 101.对称二叉树

本文介绍了如何确定递归函数的参数和返回值,以及如何在翻转二叉树和判断对称二叉树问题中应用递归。重点讲解了终止条件的设定和单层递归的逻辑,包括节点交换和递归调用的过程。
摘要由CSDN通过智能技术生成

递归三部曲:

  1. 确定递归函数的参数和返回值
  2. 确定终止条件
  3. 确定单层递归的逻辑

226.翻转二叉树

思路:
翻转二叉树,即在每次递归时将左右子树进行互换。遍历方式是前序遍历。

  1. 确定递归函数的参数和返回值
    参数就是要传入节点的指针,不需要其他参数了,通常此时定下来主要参数,如果在写递归的逻辑中发现还需要其他参数的时候,随时补充。
    返回值的话其实也不需要,但是题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就函数的返回类型为TreeNode*。
  2. 确定终止条件
    当前节点为空的时候,就返回
  3. 确定单层递归的逻辑
    因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);

代码实现

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;
        swap(root->left, root->right);  // 中
        invertTree(root->left);         // 左
        invertTree(root->right);        // 右
        return root;
    }
};

101.对称二叉树

思路:
因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。

  1. 确定终止条件
    要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。
    节点为空的情况有:(注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点)
    ● 左节点为空,右节点不为空,不对称,return false
    ● 左不为空,右为空,不对称 return false
    ● 左右都为空,对称,返回true
    此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空:
    ● 左右都不为空,比较节点数值,不相同就return false
    此时左右节点不为空,且数值也不相同的情况我们也处理了。
  2. 确定单层递归的逻辑
return node1->val == node2->val && IsSymmetric(node1->left, node2->right) && IsSymmetric(node1->right, node2->left);

此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。
● 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
● 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
● 如果左右都对称就返回true ,有一侧不对称就返回false 。

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return IsSymmetric(root->left, root->right); 
    }


    bool IsSymmetric(TreeNode* node1, TreeNode* node2){
        if(node1 == nullptr || node2 == nullptr) {
            if(node1 == nullptr && node2 == nullptr) return true;
            return false;
        }


        return node1->val == node2->val && IsSymmetric(node1->left, node2->right) && IsSymmetric(node1->right, node2->left);
    }
};
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值