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

leetcode 110.平衡二叉树

题目链接:110. 平衡二叉树 - 力扣(LeetCode)

视频链接:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树_哔哩哔哩_bilibili

思路

平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

本题就是求左右子树的高度差,如果差值<=1,就是平衡二叉树了。这道题可以和求二叉树深度的题对比一下,这样印象会更深刻一些。求高度用后序,求深度用前序。因为高度是从下到上去查,所以要左右中的依次往上遍历,而求深度是从上到下去查,所以先中间,再左右,要中左右依次往下遍历。

代码实现

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;
        return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight);
    }
    bool isBalanced(TreeNode* root) {
        return getHeight(root) == -1 ? false : true;
    }
};

leetcode 257.二叉树的所有路径

题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)

视频链接:递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径_哔哩哔哩_bilibili

思路

这道题需要找路径,自然是从上往下找,所以说要用前序(中左右),但是这道题也需要用到回溯,要知道回溯递归是一家。如图所示:

Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和_第1张图片

 使用vector结构的path容器来记录路径是为了方便回溯。

代码实现

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; 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 binaryTreePaths(TreeNode* root) {
        vector result;
        vector path;
        if (root == NULL) return result;
        traversal(root, path, result);
        return result;
    }
};

leetcode 404.左叶子之和

题目链接:404. 左叶子之和 - 力扣(LeetCode)

视频链接:二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和_哔哩哔哩_bilibili

思路

·首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。

例如:这棵二叉树左叶子之和为0

Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和_第2张图片

 如图:这棵二叉树左叶子之和为21

Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和_第3张图片

 所以左叶子的定义为:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。(把上图的‘9’当作节点A,更有助于理解)

需要注意的是,想要判断子节点是不是左叶子,必须是遍历到父节点的时候才能判断!

代码实现

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;
    }
};

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