【每日刷题】Day56

【每日刷题】Day56

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 292. Nim 游戏 - 力扣(LeetCode)

2. 129. 求根节点到叶节点数字之和 - 力扣(LeetCode)

3. 404. 左叶子之和 - 力扣(LeetCode)

1. 292. Nim 游戏 - 力扣(LeetCode)

//思路:数学问题。代码非常简单,重点在于推导过程。

//试想一下,如果只有1、2、3块石头,那么显然是必赢的,因为一次可以取走1~3块石头;但是如果有4块石头,那么就是必输的,因为不管你取1~3中的多少块石头,对手总能一次性取走最后一块石头;当有5块石头时,也是必赢的,因为你可以取走1块石头,给剩下4块石头,不论对手取走几块,你总能取走最后一块石头。

//根据这个推到思路继续往下推就容易发现,当石堆中剩下4块石头时,轮到的那个人是必输的,;而如果是4的倍数块石头时,不论你最开始取多少块石头,对手总能创造"轮到你时石堆剩下4块石头"的情况。

//而如果石头的数量不是4的倍数时,你总能创造"轮到对手时石堆剩下4块石头"的情况。

bool canWinNim(int n)

{

       return !(n%4==0);

}

2. 129. 求根节点到叶节点数字之和 - 力扣(LeetCode)

//思路:深度优先遍历。遍历每一个结点,计算当前结点到根结点的值,判断是否为叶子结点,如果是,将结果加上当前值,返回;如果不是,继续遍历。如果遍历到空结点,直接返回。

typedef struct TreeNode TN;


 

bool IsLeafNode(TN* root)

{

    return (!root->left)&&(!root->right);

}

void _sumNumbers(TN* root,int* sum,double n)

{

    if(!root)

        return;

    n = n*10+root->val;

    if(IsLeafNode(root))

    {

        (*sum)+=n;

        return;

    }

    _sumNumbers(root->left,sum,n);

    _sumNumbers(root->right,sum,n);

}

int sumNumbers(struct TreeNode* root)

{

    int ans = 0;

    _sumNumbers(root,&ans,0);

    return ans;

}

3. 404. 左叶子之和 - 力扣(LeetCode)

//0ms  100%思路:层序遍历。遇到左结点判断是否为叶子结点。是,则将结果加上该结点值;不是,则不加。

 typedef struct TreeNode* QDataType;

//队列节点

typedef struct listnode

{

    QDataType val;

    struct listnode* next;

}LN;


 

//队列头尾指针

typedef struct Queque

{

    LN* phead;

    LN* ptail;

    int size;

}QE;


 

//队列初始化

void QueInit(QE* qe)

{

    assert(qe);

    qe->phead = NULL;

    qe->ptail = NULL;

    qe->size = 0;

}


 

//入列

void QuePush(QE* qe, QDataType x)

{

    assert(qe);

    LN* newnode = (LN*)malloc(sizeof(LN));

    if (newnode == NULL)

    {

        perror("malloc:");

        exit(-1);

    }

    newnode->next = NULL;

    newnode->val = x;

    if (qe->phead == NULL)

    {

        qe->phead = qe->ptail = newnode;

    }

    else

    {

        qe->ptail->next = newnode;

        qe->ptail = qe->ptail->next;

    }

    qe->size++;

}


 

//出列

void QuePop(QE* qe)

{

    assert(qe);

    assert(qe->phead != NULL);

    assert(qe->size > 0);

    LN* tmp = qe->phead->next;

    free(qe->phead);

    qe->phead = tmp;

    qe->size--;

}


 

//获取列头元素

QDataType QueGetHead(QE* qe)

{

    assert(qe);

    assert(qe->phead != NULL);

    return qe->phead->val;

}


 

//判断队列是否为空

bool QueEmpty(QE* qe)

{

    assert(qe);

    return qe->size == 0;

}


 

typedef struct TreeNode TN;


 

bool IsLeafNode(TN* root)

{

    return !root->left&&!root->right;

}


 

int sumOfLeftLeaves(struct TreeNode* root)

{

    int ans = 0;

    QE q;

    QueInit(&q);

    if(root)

        QuePush(&q,root);

    while(!QueEmpty(&q))//判断队列是否为NULL

    {

        QDataType tmp = QueGetHead(&q);//获取队头元素

        QuePop(&q);

        if(tmp->left)//判断当前结点的左子结点是否为NULL

        {

            if(IsLeafNode(tmp->left))//判断左子节点是否为叶子结点

                ans+=tmp->left->val;//是左结点并且是叶子结点,则加上该结点的值

            QuePush(&q,tmp->left);//不为NULL入队列

        }

        if(tmp->right)//判断当前结点右子结点是否为NULL

        {

            QuePush(&q,tmp->right);//不为NULL入队列

        }

    }

    return ans;

}

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值