Leetcode 二叉树 111 222 110 257 404 513 112 113

111. Minimum Depth of Binary Tree

1.分解思想

cpp 复制代码
class Solution {
public:
    int minDepth(TreeNode* root) {
        if(root == NULL) return 0;
        int left = minDepth(root->left);
        int right = minDepth(root->right);
        int minVal = 0;
        if(root->left == NULL) minVal = 1+right;
        else if(root->right == NULL) minVal = 1+left;
        else minVal = min(left, right)+1;
        return minVal; 
    }
};

2.也可以用层序

cpp 复制代码
class Solution {
public:
    int minDepth(TreeNode* root) {
        queue<TreeNode*> que;
        int depth = 0;

        if(root != NULL) que.push(root);
        while(!que.empty()){
            int size = que.size();
            depth++;
            for(int i=0; i<size; i++){
                TreeNode* cur = que.front();
                if(cur->left == NULL && cur->right == NULL){
                    return depth;
                }
                que.pop();
                if(cur->left) que.push(cur->left);
                if(cur->right) que.push(cur->right);
            }
        }

        return depth;
    }
};

222. Count Complete Tree Nodes

cpp 复制代码
class Solution {
public:
    int countNodes(TreeNode* root) {
        int lh = 0, rh = 0;
        TreeNode* l = root;
        TreeNode* r = root;
        while(l != NULL){
            l = l->left;
            lh++;
        }
        while(r != NULL){
            r = r->right;
            rh++;
        }
        if(lh == rh){
            return pow(2, lh) - 1;
        }
        return 1+countNodes(root->left)+countNodes(root->right);
    }
};

这里是完全二叉树,所以跟普通的求法不同

110. Balanced Binary Tree

cpp 复制代码
class Solution {
public:
    bool isBalanced(TreeNode* root) {
        nodeDepth(root);
        return is_Bal;
    }

    bool is_Bal = true;

    int nodeDepth(TreeNode* cur){
        if(cur == NULL) return 0;
        int leftDepth = nodeDepth(cur->left);
        int rightDepth = nodeDepth(cur->right);

        if(abs(leftDepth-rightDepth) > 1){
            is_Bal = false;
        }

        return 1+max(leftDepth, rightDepth);
    }
};

257. Binary Tree Paths

cpp 复制代码
class Solution {
public:
    vector<string> res;
    vector<int> path;

    vector<string> binaryTreePaths(TreeNode* root) {
        traversal(root);
        return res;
    }

    void traversal(TreeNode* root){
        path.push_back(root->val);
        if(root->left == NULL && root->right == NULL){
            string sPath;
            for(int i=0; i<path.size()-1; i++){
                sPath += to_string(path[i]);
                sPath += "->";
            }
            sPath += to_string(path[path.size()-1]);
            res.push_back(sPath);
            return;
        }

        if(root->left){
            traversal(root->left);
            path.pop_back();
        } 
        if(root->right){
            traversal(root->right);
            path.pop_back();
        }
    }
};

404. Sum of Left Leaves

cpp 复制代码
class Solution {
public:
    int sum = 0;
    int sumOfLeftLeaves(TreeNode* root) {
        traversal(root);
        return sum;

    }
    void traversal(TreeNode* cur){
        if(cur == NULL) return;
        if(cur->left != NULL && cur->left->left == NULL && cur->left->right == NULL){
            sum += cur->left->val;
        }
        traversal(cur->left);
        traversal(cur->right);
    }
};

第一遍没有写cur == null的情况,直接在第二个条件返回时不行的,会越界

要搞清楚是左子叶

513. Find Bottom Left Tree Value

1.迭代法

cpp 复制代码
class Solution {
private:
    int depth = 0;
    int maxDepth = 0;
    int res;

    void traversal(TreeNode* cur){
        if(cur == NULL) return;
        depth++;
        if(depth > maxDepth){
            res = cur->val;
            maxDepth = depth;
        }
        
        traversal(cur->left);
        traversal(cur->right);
        depth--;
    }
public:
    int findBottomLeftValue(TreeNode* root) {
        traversal(root);
        return res;
    }
};

写的时候出现的小错误:

1.记得更改maxdepth的值

2.depth++要放在if条件的前面更好,不然会漏掉root的值

因为这道题的tree的大小是1开始,所以如果放在if条件后面,可以在主函数里先赋值res = root->val; 但如果不是就不可以了,所以还是放在前面比较好

2.层序的方法

cpp 复制代码
class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queue<TreeNode*> que;
        int res;
        if(root != NULL) que.push(root);

        while(!que.empty()){
            int size = que.size();

            for(int i=0; i<size; i++){
                TreeNode* cur = que.front();
                if(i == 0) res = cur->val;
                que.pop();
                if(cur->left) que.push(cur->left);
                if(cur->right) que.push(cur->right);
            }
        }

        return res;
    }
};

112. Path Sum

cpp 复制代码
class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        traversal(root, targetSum);
        return isSum;
    }

    bool isSum = false;

    void traversal(TreeNode* cur, int target){
        if(cur == NULL) return;
        if(cur->val == target && cur->left == NULL && cur->right == NULL) isSum = true;
        traversal(cur->left, target-cur->val);
        traversal(cur->right, target-cur->val);
    }
};

写错的地方:一定要注意是一整条路径,所以最后的一定是叶子结点

113. Path Sum II

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;
    vector<int> path;

    void traversal(TreeNode* cur, int target){
        if(cur == NULL) return;
        path.push_back(cur->val);
        if(cur->val == target && cur->left == NULL && cur->right == NULL){
            res.push_back(path);
        }
        if(cur->left){
            traversal(cur->left, target-cur->val);
            path.pop_back();
        }
        if(cur->right){
            traversal(cur->right, target-cur->val);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        traversal(root, targetSum);
        return res;
    }
};

这里一定要判断cur->left或者cur->right是否存在,因为这里我们要在前面使用path, 如果是空的, cur-val是没有值的, 就会报错

cur == null在正常情况下是不需要,但当树没有任何值的时候,如果没有cur == null的判断的话, 是会报错的,所以这个情况直接在主函数写也可以

一些想法:这里不用加所谓的终止条件,是因为本身在下面判断cur->left和cur->right就已经算终止条件了(之后在别的题在验证一下)

相关推荐
林的快手24 分钟前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
千天夜33 分钟前
多源多点路径规划:基于启发式动态生成树算法的实现
算法·机器学习·动态规划
从以前39 分钟前
准备考试:解决大学入学考试问题
数据结构·python·算法
.Vcoistnt1 小时前
Codeforces Round 994 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划
柒月的猫1 小时前
方格分割(蓝桥杯2017年试题D)
职场和发展·蓝桥杯
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战训练三)
数据结构·c++·算法·图论
柒月的猫3 小时前
翻转(蓝桥杯2023大学C组试题E)
职场和发展·蓝桥杯
Dream it possible!4 小时前
LeetCode 热题 100_LRU 缓存(35_146_中等_C++)(哈希表 + 双向链表)(构造函数声明+初始化列表=进行变量初始化和赋值)
c++·leetcode·缓存
我码玄黄4 小时前
正则表达式优化之算法和效率优化
前端·javascript·算法·正则表达式
Solitudefire4 小时前
蓝桥杯刷题——day9
算法·蓝桥杯