leetcode刷题

  1. 二叉树的所有路径

递归中稍稍带有一点回溯,理解了之后并不难。

回溯,其本质就是递归之后返回的过程。只是需要在返回后,重写一段逻辑。

(自己的理解:像是析构函数,在收回内存后,调用析构函数。而回溯,其实就是我们重写析构函数的过程。)

void callback(TreeNode* root, vector<int> &route, vector<string> &result){
        if(!root) return;

        route.push_back(root->val);				//先根遍历,每遇到一个结点,就添加
        callback(root->left, route, result);
        callback(root->right, route, result);
        if(!root->left && !root->right){          //回溯,遇到叶子节点,就删除,准备返回
            string row_result = "";
            for(auto i : route){
                row_result += to_string(i);
            }
            result.push_back(row_result);
        }
        route.pop_back();
        
        return ;
    }

  1. 左叶子节点之和

int sumleaves(node* root){
    if(!root) return 0;

    int left = sumleaves(root->left);
    int right = sumleaves(root->right);  //后序遍历
                                        //核心其实不在于处理左叶子节点,而是处理其父节点
    if(root->left && !root->left->left && !root->left->right){   
        left += root->val;
    }

    return left + right;
}

  1. 平衡二叉树

自顶向下方法:

计算每个节点的高度,再使用先序遍历,向下递归如果遇到不平衡的子树,直接返回false,如果都遍历完成,返回true。

自底向上:

int ave(node* root){
    if(!root) return 0;

    int left = ave(root->left);
    int right = ave(root->right);

    if(abs(left-right)<=1 && left!=-1 && right!=-1){
        return max(left, right) + 1;
    }
    else return -1;
    
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值