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

文章介绍了在代码随想录算法训练营中的三层主题:层序遍历的实现与分析,226题翻转二叉树的解法,以及101题对称二叉树的深度优先搜索策略。作者强调了递归在这些问题中的应用,以及如何通过反向思维简化问题解决。
摘要由CSDN通过智能技术生成

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

视频讲解推荐y总:http://www.acwing.com

层序遍历

我是一看就会,一写就费,先看代码:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
       vector<vector<int>> res;
       queue<TreeNode*> q;
       if(root == NULL) return res;
       q.push(root);
       while(q.size())
       {
           vector<int> level;
           int len = q.size();
           while(len--)
           {
               TreeNode* t = q.front();
               level.push_back(t->val);
               if(t->left) q.push(t->left);
               if(t->right) q.push(t->right);
               q.pop();
           }
           res.push_back(level);
       }
       return res;
    }
};

层序遍历的过程其实大家都清楚,如果跟我一样,就是只知道层序遍历的思路,然后会用到队列这个数据结构,代码就不知道了,突然发现,以前图省事错过的,逃避的,现在都要还回来。
行,不多感慨了,分析一下代码吧,一上来老规矩,先检查root,然后先让root进队,创建一个数组,存储每层的节点的数值,当一个节点出队的时候,就让他的左右子树进队(如果有左右子树的话)。最后每有一层结束,就把这一层加进结果中。

226.翻转二叉树

先看代码:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(!root) return root;
        swap(root->left,root->right);
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};

这道题目归结起来就是一个根节点和左右孩子,将左右孩子互换,然后递归,递归这种算法我觉得并不好写,因为需要准确的找到递归结束的条件。

101. 对称二叉树

先看代码:

class Solution {
public:
    bool dfs(TreeNode* p,TreeNode* q)
    {
        if(!p && !q) return true;
        if(!p || !q || p->val != q->val) return false;
        return dfs(p->left,q->right) && dfs(p->right,q->left);
    }
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        return dfs(root->left,root->right);
    }
};

这道题目其实不难,但是它让我加深了反向思维,有的时候正向麻烦,反向反而会轻松一些,比如这个,如果正向写,条件就是左边等于右边,而且左子树或者右子树不能为空,还有就是一个节点的时候怎么办。反向就比较好,只要有一个子树为空或者不相等,就返回false,所以我想起我老师以前说过的,递归并不好写。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值