Day17|Leetcode 110. 平衡二叉树 Leetcode 257. 二叉树的所有路径 Leetcode 404. 左叶子之和

一刷还是以递归法为主,下面的题目都是默认递归法

Leetcode 110 平衡二叉树

题目链接 110 平衡二叉树

本题目和二叉树的最大深度差不多,但是还是要注意几个点的:

思路:如果我们的左右子树不是平衡二叉树了,那么整个二叉树就不是平衡二叉树,所以我们就不记录高度,用-1来返回给父节点,不停返回,直到根节点,除了这种判断就是题目中给的判断标准了,一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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 getHeight(TreeNode* node){
        if(node == NULL){
            return 0;
        }//结束判断后返回上一层递归

        int leftHeight = getHeight(node->left);
        if(leftHeight == -1) return -1;
        int rightHeight = getHeight(node->right);
        if(rightHeight == -1)  return -1;
        

        int rsult;
        if(abs(leftHeight-rightHeight) > 1){
            return -1;
        }else{
            return 1+max(leftHeight,rightHeight);
        }
    }

    bool isBalanced(TreeNode* root) {
        if(getHeight(root) == -1){
            return false;
        }else{
                return true;
        }
        }
       
    };

Leetcode 257. 二叉树的所有路径 

题目链接 257 二叉树的所有路径

本题目需要将二叉树的全部节点输出出来,我们肯定要遍历一遍才能将全部的节点都记录一遍,所以,此时我们就要考虑遍历方式,我们会发现输出结果是从根节点往左往右来输出的,所以我们需要前序遍历,在这里,我们去观察输出结果,会发现左右子树需要前后输出,递归完成左子树时,我们就要回溯根节点重新往右子树,所以我们需要用到回溯,递归中已经用到了,但是没有体现出来,但是今天我们要将递归中的回溯写出来。

下面上代码加注释:

/**
 * 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:
    void traversal(TreeNode* cur,vector& path,vector& result){
        path.push_back(cur->val);//中,中为什么写在这里,因为最后一个节点也要加入到path中 
        if(cur->left == NULL && cur->right == NULL){
            string sPath;
            for(int i=0;ileft){
            traversal(cur->left,path,result);//遍历记录左边
            path.pop_back();//回溯
        }
        if(cur->right){
            traversal(cur->right,path,result);//遍历记录右边
            path.pop_back();//回溯
        }
    }
public:
    vector binaryTreePaths(TreeNode* root) {
            vector result;
            vector path;
            if(root == NULL){
                return result;//根节点为0,就结束
            }
            traversal(root,path,result);
            return result;
    }
};

可能会遇到的问题:

这里使用vector 结构path来记录路径,所以要把vector 结构的path转为string格式,再把这个string 放进 result里。

那么为什么使用了vector 结构来记录路径呢? 因为在下面处理单层递归逻辑的时候,要做回溯,使用vector方便来做回溯。

Leetcode 404. 左叶子之和

题目链接 404 左叶子之和

审清题目,什么是左叶子之和,首先要明白什么是叶子节点,叶子节点的左右子节点都为空,然后什么是左叶子节点,就是节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点,理解了这一点,这个题就差不多了,下面上代码加注释:

/**
 * 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 sumOfLeftLeaves(TreeNode* root) {
            if(root == NULL){//结束条件
                return 0;
            }
            if(root->left == NULL && root->right == NULL){
                return 0;//其实这个也可以不写,如果不写不影响结果,但就会让递归多进行了一层。
            }
            int leftValue = sumOfLeftLeaves(root->left);//递归,左
            if(root->left && !root->left->left && !root->left->right){//左叶子点的判断
                leftValue = root->left->val;
            }
            int rightValue = sumOfLeftLeaves(root->right);//递归,右
            int sum = leftValue + rightValue;//中
            return sum;
    }
};

end;周天大总结!!!

你可能感兴趣的:(leetcode,算法,职场和发展)