leetcode刷题 226, 101, 104, 111

226.翻转二叉树

翻转一棵二叉树。

使用前序遍历或后序遍历实现

/**
 * 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:
    TreeNode* invertTree(TreeNode* root) {
        if(root != nullptr){
            invertTree(root->left);
            invertTree(root->right);
            TreeNode * p = root->right;
            root->right = root->left;
            root->left = p;
        }
        return root;
    }
};

101. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

并非检查每个左右子树是否对称,而是整体的左右子树是否对称。
compare函数中,在检查到上层节点满足对称,要递归地检查下层的节点是否对称。

/**
 * 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 compare(TreeNode * left, TreeNode * right){
        if(left == nullptr && right == nullptr)
            return true;
        else if(left == nullptr && right != nullptr)
            return false;
        else if(left != nullptr && right == nullptr)
            return false;
        else if(left->val != right->val)//最后一种情况对应的是两个非空节点,直接比较两个非空节点的值。
            return false;
        return compare(left->left, right->right) && compare(left->right, right->left);
    }
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr)
            return true;
        return compare(root->left, root->right);
    }
};

104.二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例: 给定二叉树 [3,9,20,null,null,15,7],

返回它的最大深度 3 。

/**
 * 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 getDepth(TreeNode * cur){
        if(cur == nullptr)
            return 0;
        else
            return max(getDepth(cur->left), getDepth(cur->right)) + 1;
    }
    int maxDepth(TreeNode* root) {
        return getDepth(root);
    }
};

111.二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

返回它的最小深度 2.

/**
 * 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 getDepth(TreeNode* cur){
        if(cur == nullptr)
            return 0;
        int leftDepth = getDepth(cur->left);
        int rightDepth = getDepth(cur->right);

        if(cur->left != nullptr && cur->right == nullptr)
            return leftDepth + 1;
        if(cur->right != nullptr && cur->left == nullptr)
            return rightDepth + 1;
        return 1 + min(leftDepth, rightDepth);//左右子树都不为空时取小的深度+1
    }
    int minDepth(TreeNode* root) {
        return getDepth(root);
    }
};

求最小深度的时候要注意排除非叶子节点的情况(只有一个孩子的节点)

posted @ 2025-02-08 13:41  arbiter9  阅读(22)  评论(0)    收藏  举报