代码随想录二刷 Day17

110.平衡二叉树

class Solution {
public:
//深度与高度前序与后序一个很大的差别是需不需要向上返回结果
    int height(TreeNode* Node) {  //要思考下这个题返回变量是bool还是int
        if(Node == NULL) return 0;
        int left_height = height(Node -> left); //左
        if (left_height == -1) return -1;       //这一句一开始没写,不写在一些特殊二叉树会出问题;
        int right_height = height(Node -> right);//右
         if (right_height == -1) return -1; 
        int middle_height;
        if(abs(left_height - right_height) > 1){
            middle_height = -1;
        } else {
            middle_height = 1 + max(left_height, right_height); //中,这个中的写法和之前不一样,还要分类写
        }
        return middle_height;
    }

    bool isBalanced(TreeNode* root) {
    return height(root) == -1 ? false : true;
    }
};

下面那句如果不写的话,那么下面那个例子回返回左子树高度-1,右子树高度也是-1. 然后高度差算出来小于1,最后就会返回结果说这是个平衡二叉树; 主要是因为当得到第一个-1的时候递归还没有结束,不人为结束的话这个结果会被后面的递归改变

 if (left_height == -1) return -1; 

代码随想录二刷 Day17_第1张图片

257. 二叉树的所有路径

有难度,写不出

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

代码随想录二刷 Day17_第2张图片

404.左叶子之和

递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。

class Solution {
public:

    int sum(TreeNode* node) {
        if(node == NULL) return 0;
        int left = sum(node->left);
        if(node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
            left = node->left->val;
        }
        int right = sum(node->right); //右
        int sum = left + right; //中
        return sum;
    }

    int sumOfLeftLeaves(TreeNode* root) {
        int result = sum(root);
        return result;
    }
};

你可能感兴趣的:(算法)