【每日刷题】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;
}