leetcode刷题

自顶向下方法:

计算每个节点的高度,再使用先序遍历,向下递归如果遇到不平衡的子树,直接返回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. 最左下角叶子节点的值

层序遍历法:直接最后一层第一个节点就是要求的节点

(小trick:不用记录层数来统计是否是最后一层,每一层都保留,那么上一层一定会将下一层覆盖,最后返回即可)

(小trick2:通过右—》左的顺序入队,那么最后一个就是要求的点)

递归--回溯法:

和求最大深度类似。不同点在于:求深度是后序遍历,无法知道此节点是否是最左下的。

另外是否使用回溯:当需要关注具体的路线的时候,需要使用回溯,如果只是需要从整体把握,非回溯就能搞定。

而求该题需要关注具体的路线,因此要使用回溯的方法。

    int maxdep = 0;
    int maxval = 0;
    void leftchild(TreeNode* root, int dep){
        if(!root) return ;

        dep++;
        leftchild(root->left, dep);
        leftchild(root->right, dep);
        if(!root->left && !root->right && dep>maxdep){
            maxdep = dep;
            maxval = root->val;
            return ;
        }
        else{
            return ;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值