代码随想录第二十天 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和(1st)

110.平衡二叉树

看完想法:求深度和求高度的区别一定要弄懂。求深度是求从根节点到子节点的距离(自上而下),求高度是求从子节点到根节点的距离(自下而上),求高度一般是用后序遍历(层层向上返回当前的高度),求深度用前序遍历(是向下遍历)

cpp 复制代码
int isbalance(TreeNode* root){
        int result;
        if (root==NULL) return 0;
        int leftnum = isbalance(root->left);
        if(leftnum==-1) return -1;
        int rightnum = isbalance(root->right);
        if(rightnum==-1) return -1;

        if (abs(leftnum - rightnum) > 1) {  // 中
        result = -1;
        } else {
        result = 1 + max(leftnum, rightnum); // 以当前节点为根节点的树的最大高度
        }

return result;
    }


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

257. 二叉树的所有路径

看完想法:注意遇到叶子节点的终止方式,以及回溯的时刻

cpp 复制代码
void traversal(TreeNode* root, vector<int>& path, vector<string>& result){
        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]);  //在C++ 11中有这个函数
                spath+= "->"; //因为要加箭头,所以for循环只到倒数第二个
            }
            spath += to_string(path[path.size()-1]);
            result.push_back(spath);
            return ;
        }
        if(root->left){
            traversal(root->left, path, result);
            path.pop_back(); //需要返回上面一个节点
        }
        if(root->right){
            traversal(root->right, path, result);
            path.pop_back();
        }
    }


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

    }

404.左叶子之和

看完想法:左叶子的明确定义:**节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。**不能通过遍历到该节点判断是否是叶子节点,而是应该通过父节点判断子节点是否是叶子节点

cpp 复制代码
int sumOfLeftLeaves(TreeNode* root) {
        if(root==NULL) return 0;

        int leftvalue = sumOfLeftLeaves(root->left);
        if(root->left!=NULL && root->left->left == NULL && root->left->right == NULL) leftvalue+=root->left->val;
        int rightvalue = sumOfLeftLeaves(root->right);
        int sum = leftvalue + rightvalue ;
        return sum;

    }
相关推荐
小羊在奋斗5 分钟前
【LeetCode 热题 100】二叉树的最大深度 / 翻转二叉树 / 二叉树的直径 / 验证二叉搜索树
算法·leetcode·职场和发展
卡戎-caryon19 分钟前
【C++】15.并发支持库
java·linux·开发语言·c++·多线程
superior tigre1 小时前
C++学习:六个月从基础到就业——C++11/14:列表初始化
c++·学习
2301_794461571 小时前
力扣-283-移动零
算法·leetcode·职场和发展
编程绿豆侠1 小时前
力扣HOT100之二叉树:98. 验证二叉搜索树
算法·leetcode·职场和发展
啊吧怪不啊吧1 小时前
C/C++之内存管理
开发语言·汇编·c++
superior tigre1 小时前
C++学习:六个月从基础到就业——C++11/14:decltype关键字
c++·学习
技术流浪者1 小时前
C/C++实践(十)C语言冒泡排序深度解析:发展历史、技术方法与应用场景
c语言·数据结构·c++·算法·排序算法
Funny-Boy1 小时前
Reactor (epoll实现基础)
服务器·网络·c++
I AM_SUN2 小时前
98. 验证二叉搜索树
数据结构·c++·算法·leetcode