代码随想录算法训练营第16天(二叉树4)| 平衡二叉树&二叉树的所有路径&左叶子之和

110.平衡二叉树

leetcode题目链接
题目链接/文章讲解/视频讲解

重点:

平衡二叉树的概念:所以左子树与右子树的高度差不大于1
使用后序遍历:手机子树的高度,上交给父节点,来计算

代码实现

class Solution {
public:
    int getHeight(TreeNode* node) {
        //退出条件,如果当前树是空,树的高度也就是0
        if(node == nullptr) return 0;
        
        //当前层的处理逻辑 分别获取左右子树是不是平衡二叉树,如果有一个不是返回-1
        int left_height = getHeight(node->left);
        if(left_height == -1) return -1;//此时可以提前退出
        int right_height = getHeight(node->right);
        if(right_height == -1) return -1;
        
        //如果左右子树的差的绝对值大于1 ,说明不是平衡二叉树
        if(abs(right_height - left_height) > 1) {
            return -1;
        }
        return 1 + max(right_height, left_height);
    }
    bool isBalanced(TreeNode* root) {
        return getHeight(root) == -1 ? false : true;
    }
};

257. 二叉树的所有路径

leetcode题目链接

题目链接/文章讲解/视频讲解决
重点:回溯,层层回溯

class Solution {
private:

    void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
        path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中 
        // 这才到了叶子节点
        if (cur->left == NULL && cur->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]);
            result.push_back(sPath);
            return;
        }
        if (cur->left) { // 左 
            traversal(cur->left, path, result);
            path.pop_back(); // 回溯
        }
        if (cur->right) { // 右
            traversal(cur->right, path, result);
            path.pop_back(); // 回溯
        }
    }

public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        vector<int> path;
        if (root == NULL) return result;
        traversal(root, path, result);
        return result;
    }
};

这是大家第一次接触到回溯的过程, 我在视频里重点讲解了 本题为什么要有回溯,已经回溯的过程。

404.左叶子之和

leetcode题目链接
题目链接/文章讲解/视频讲解

重点:

左叶子的概念:本身是左节点,并且是叶子节点
访问的层数:访问到叶子节点的上一个节点才能判断是不是左叶子

代码实现

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root == nullptr) return 0;
        //当前节点的左右节点都为空,就可以提前退出了
        if(root->left == nullptr && root->right == nullptr) return 0;

        int sum_left = 0;
        //左节点存在并且他的左右节点都为空说明是左叶子,如果是叶子节点,sum就是叶子节点的值
        //如果当前节点的左节点是叶子节点 就收集左叶子的值,如果不是叶子节点再进行递归
        if(root->left != nullptr && root->left->left == nullptr && root->left->right == nullptr) {
            sum_left = root->left->val;
        } else {
        	sum_left = sumOfLeftLeaves(root->left); 
        }

        int sum_right = sumOfLeftLeaves(root->right); 

        return sum_left + sum_right;
    }
};

你可能感兴趣的:(算法,c++,数据结构,leetcode)