2021-06-01二叉树相关:平衡二叉树+看力扣题解C++版

1.平衡二叉树

2021-06-01二叉树相关:平衡二叉树+看力扣题解C++版_第1张图片

这道题目刚开始的时候的思路是不正确的,注意是每个节点的左右子树的高度差不超过1,每个节点。如果我们在处理子树时已经发现不平衡了,那么可以返回-1,使得所有其长辈节点可以避免多余的判断。

class Solution {
public:
inline int abs(int a,int b){
    return a>b? a-b:b-a;
}
    bool isBalanced(TreeNode* root) {
        if(root==NULL) return true;
        return !(helper(root)==-1);
    }
    int helper(TreeNode* root){
        if(root==NULL) return 0;
        int left=helper(root->left), right=helper(root->right);
        if(left==-1 || right==-1 || abs(left,right)>1){
            return -1;
        }
        return max(left,right)+1;
    }
};

2.求一个二叉树的最长直径

一棵二叉树的直径长度是任意两个节点路径长度中的最大值,已经提示了:可能穿过也可能不穿过根节点。helper函数还是返回以该节点为根的子树的深度。

2021-06-01二叉树相关:平衡二叉树+看力扣题解C++版_第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 ans;
    int diameterOfBinaryTree(TreeNode* root) {
        if(root==NULL){
            return 0;
        }
        helper(root);
        return ans-1;
    }
    int helper(TreeNode* root){
        if(root==NULL) return 0;
        int L=helper(root->left);
        int R=helper(root->right);
        ans=max(ans,L+R+1);
        return max(L,R)+1;
    }

};

3.路径总和III

它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

4.练习 有效的回文串

你可能感兴趣的:(leetcode,leetcode,c++,深度优先)