101. 对称二叉树(easy,树,深度优先搜索)

题目描述:

 算法思想:

看思路的时候可以看题目中的第一个输出例子。本题利用dfd来实现树的遍历,在遍历的过程中考虑需要做的事情。

  • dfs函数中需要两个参数,就是根结点的左右子树的根结点。因为需要深度搜索判断整棵树是否对称。
  • 首先处理特殊的情况:
  1. 当根节点的左子树为空,然而右子树不为空时,返回false
  2. 当根结点的右子树为空,然而左子树不为空时,返回false
  3. 当只有根结点的时候,返回true
  4. 一棵树只有三个结点时,要判断根结点的左右结点的值val是否相同,same时,返回true
  • 接下来就要处理大问题了,当满足根节点的左右节点都不为空,并且数值相同的情况,此时才做搜索,做下一层的判断
  • 在做dfs时,需要注意所传入的参数,根据实例一可以看出应该是dfs(left->left,right->right)和dfs(left->right,right->left)。
  • 当dfs同时为true时,返回true。

实现代码:

/**
 * 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 isSymmetric(TreeNode* root) {
        if(root==NULL) return true;
        return dfs(root->left,root->right);
    }
    bool dfs(TreeNode *left,TreeNode *right){
        //首先排除特殊情况:左子树空,右子树不空
        if(left==NULL&&right!=NULL){
            return false;
        }
        //左子树不空,右子树空时,返回false
        else if(left!=NULL&&right==NULL){
            return false;
        }
        //只有头结点的时候返回true
        else if(left==NULL&&right==NULL){
            return true;
        }
        //根的左右子树的值不相等时,也表示不对称
        else if(left->val!=right->val){
            return false;
        }
        // 根节点的左右节点都不为空,并且数值相同的情况,此时才做搜索,做下一层的判断
        bool l=dfs(left->left,right->right);//判断左子树的左子树,右子树的右子树是否对称
        bool r=dfs(left->right,right->left);//判断左子树的右子树,右子树的左子树是否对称
        //都为true时,整棵树是对称的
        bool res=l&&r;
        return res;
        
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值