【二叉树】【遍历+子树问题】1、二叉树的最大深度+2、二叉树的直径+3、二叉树的坡度+4、二叉树的前序遍历+5、二叉树的最小深度

因为二叉树和递归这块儿学的比较菜,所以先从简单题做起。

5道简单题:

1、二叉树的最大深度(难度:简单)

在这里插入图片描述
在这里插入图片描述

该题对应力扣网址

AC代码

没啥说的,前序遍历

/**
 * 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:
    int res=0;
    int depth=0;
    int maxDepth(TreeNode* root) {
        traverse(root);
        return res;
    }
    void traverse(TreeNode* root){
        if(root==NULL){
            return;
        }
        //前序位置
        depth++;
        res=max(res,depth);
        traverse(root->left);
        traverse(root->right);
        //后序位置
        depth--;
    }
};

2、二叉树的直径(难度:简单)

在这里插入图片描述
在这里插入图片描述
该题对应力扣网址

AC代码

思路看了以为会了,结果写的时候发现还是没有掌握要领。
一个小经验:就是只想某一个结点的思路,别去想一整棵树的思路,因为递归会帮你实现其他结点,想得多反而思路容易乱。
思路:
我一开始在求二叉树的最大深度求每一个结点的左右子树结点个数这两个思路之间来回徘徊,分别写了代码之后发现又不是我想要的,总之就是乱的不行。这个时候我发现,自己的思维是受限制的,受到之前看过的模板的限制,失去了自己的分析。
这个题求直径,其实就是求一个结点的左右子树深度之和,然后找最大值。
那么对一个结点来说,出去基本的代码步骤,需要考虑的两个地方就是返回值最大值的更新
返回值:既然是求深度,那么每次返回的都应该是左右子树里深度最大的,取大值,并且要把根结点加上,代表了以返回到的节点为根的这课子树的深度,这当然包含根结点,所以要+1。
最大值的更新:应该是左右子树深度之和,依然是取大值。
(这么写下来之后,发现思路真的清晰了不少)

/**
 * 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:
    int answer;
    //左右子树的深度
    int depth(TreeNode* root){
        if(root==NULL){
            return 0;
        }
        int l=depth(root->left);
        int r=depth(root->right);
        answer=max(answer,l+r);
        return max(l,r)+1;
    }
    int diameterOfBinaryTree(TreeNode* root) {
        answer=0;
        depth(root);
        return answer;

    }
};

3、二叉树的坡度(难度:简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该题对应力扣网址

AC代码

吸取上一个题的经验,终于有点思路了。

/**
 * 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:
    int answer;
    int depth(TreeNode* root){
         if(root==NULL){
            return 0;
        }
        int l=depth(root->left);
        int r=depth(root->right);
        root->val+=l+r;
        // cout<<"root->val:"<<root->val<<endl;
        answer+=abs(l-r);
        return root->val;
    }
    int findTilt(TreeNode* root) {
       answer=0;
       depth(root);
       return answer;
    }
};

4、二叉树的前序遍历(难度:简单)

在这里插入图片描述
该题对应力扣网址

AC代码

水题

/**
 * 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:
    vector<int> answer;
    void traverse(TreeNode* root){
        if(root==NULL){
            return;
        }
        answer.push_back(root->val);
        traverse(root->left);
        traverse(root->right);

    }
    vector<int> preorderTraversal(TreeNode* root) {
        traverse(root);
        return answer;
    }
};

5、二叉树的最小深度(难度:简单)

在这里插入图片描述

该题对应力扣网址

AC代码

/**
 * 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:
    int depth;
    int answer;
    void traverse(TreeNode* root){
        if(root==NULL){
            return;
        }
        depth++;
        if(root->left==NULL && root->right==NULL){
            answer=min(answer,depth);
        }
        traverse(root->left);
        traverse(root->right);
        depth--;
    }
    int minDepth(TreeNode* root) {
        depth=0;
        answer=INT_MAX;
        if(root==NULL){
            answer=0;
        }
        traverse(root);
        return answer;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江星竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值