0514

101

/**
 * 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) {}
 * };
 * 给你一个二叉树的根节点 root , 检查它是否轴对称
 * 思路:1.若两个节点都为空,即说明经过一系列递归检查后,直到找到两边都为空都没检查出错误来,就说明在这个递归阶段暂时是相同的
 *      2.经过两个节点是否都为空的检查后(两个节点必定有一个不为空),再进行是否存在一个及以上节点为空的检查
 *      3.返回时,先进行两个节点的数值对比,再递归的检查下去
 */
class Solution {
private:
    bool sym(TreeNode* rt1,TreeNode* rt2){
        if(rt1== nullptr&&rt2== nullptr)return true;
        if(rt1== nullptr||rt2== nullptr)return false;
        return (rt1->val==rt2->val)
        &&sym(rt1->left,rt2->right)
        &&sym(rt1->right,rt2->left);
    }
public:
    bool isSymmetric(TreeNode* root) {
        sym(root,root);
    }
};

104

/**
 * 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 {
private:
    int depth(TreeNode* rt){
        if(rt== nullptr)return 0;
        int l=depth(rt->left);
        int r=depth(rt->right);
        return max(l,r)+1;
    }
public:
    int maxDepth(TreeNode* root) {

         return depth(root);
    }
};

543

/**
 * 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) {}
 * };
 * 求二叉树的直径
 * 1.二叉树的直径的定义是:二叉树左儿子的深度和右儿子深度之和
 * 2.二叉树的直径不一定穿过根节点
 * 例如:
 *      /
 *    /\               /\
 *  /  \ 中的直径应该为 /  \,并不包含根节点,所以需要引入Max局部变量记录每次递归的最大值(l+r)
 * if(l+r>Max)Max=l+r;
 * 因为有可能是加上根节点直径反而小了。
 * 以上图为例,存在这种情况即:1.根节点不存在右儿子,则若候选节点的右子树的深度>1就能使不通过根节点的直径大于通过根节点的直径
 *                        2.根节点存在右子树,则只要候选节点的右子树深度>1+根节点右子树的深度即可
*/
class Solution {
private:
    int Max=0;
    int depth(TreeNode* rt){
        if(rt==nullptr)
            return 0;
        int l=depth(rt->left);//递归求左儿子的深度
        int r=depth(rt->right);//递归求右儿子的深度
        if(l+r>Max)Max=l+r;
        return max(l,r)+1;//叶子节点的深度为 1
    }
public:
    int diameterOfBinaryTree(TreeNode* root) {
        depth(root);
        return Max;
    }
};
posted @ 2022-05-15 00:05  ftwftw  阅读(128)  评论(0)    收藏  举报