【每日刷题】Day69
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
1. 链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com)
2. LCR 047. 二叉树剪枝 - 力扣(LeetCode)
3. 623. 在二叉树中增加一行 - 力扣(LeetCode
1. 链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com)
//思路:归并排序。将所有奇数位结点看成一条链表,所有偶数位结点看成一条链表。遍历奇数位结点,先存入指针数组中;后遍历偶数位结点,存入指针数组中。遍历指针数组,将所有结点链接为一条链表。
typedef struct ListNode LN;
struct ListNode* oddEvenList(struct ListNode* head )
{
if(!head)
return NULL;
LN* arr[100001] = {0};
int count = 0;
LN* pmove = head;
while(pmove&&pmove->next)//遍历奇数位结点
{
arr[count++] = pmove;
pmove = pmove->next->next;
}
if(pmove)
arr[count++] = pmove;
pmove = head->next;
while(pmove&&pmove->next)//遍历偶数位结点
{
arr[count++] = pmove;
pmove = pmove->next->next;
}
if(pmove)
arr[count++] = pmove;
int i = 0;
for(i = 0;i<count-1;i++)//将所有结点链接为一条链表
{
arr[i]->next = arr[i+1];
}
arr[i]->next = NULL;
return head;
}
2. LCR 047. 二叉树剪枝 - 力扣(LeetCode)
//0ms 100%思路:深度优先遍历。遍历二叉树,每个结点的左右孩子结点的值的情况。
// ① 递归终止条件:如果遍历到NULL,或者遍历到叶子结点并且叶子结点的值为0,返回false;否则,返回true。
// ② 递归函数结束返回值:当左右孩子返回后,1.判断左右孩子结点是否有true,2.并且判断当前父亲结点是否为1,只要有一个满足,则返回true。
// ③ 最终答案:当递归函数全部结束回到主函数时,需要判断最终返回的是否为true。如果不是,则答案返回NULL;如果是,则返回根结点root。
typedef struct TreeNode TN;
//判断是否为叶子结点bool IsLeafNode(TN* root)
{
return !root->left&&!root->right;
}
bool _pruneTree(TN* root)
{
//返回false的条件
if(!root||(IsLeafNode(root)&&!root->val))
return false;
//返回true的条件
if(IsLeafNode(root)&&root->val)
return true;
//如果满足裁剪要求,则直接裁剪掉当前子树
bool left = _pruneTree(root->left);
if(!left)
root->left = NULL;
bool right = _pruneTree(root->right);
if(!right)
root->right = NULL;
return left||right||root->val;//递归函数结束返回值
}
struct TreeNode* pruneTree(struct TreeNode* root)
{
bool ret = _pruneTree(root);//判断最终根节点的返回值
if(!ret)
return NULL;
return root;
}
3. 623. 在二叉树中增加一行 - 力扣(LeetCode)
//思路:深度优先遍历。遍历二叉树,找到满足题意的那一层的上一层结点,创建两个结点newnode1和newnode2。newnode1的left指向当前结点的left,newnode1的right指向NULL,再将当前结点的left指向newnode1;newnode2的right指向当前结点的right,newnode2的left指向NULL,再将当前结点的right指向newnode2。
// 特别地:需要处理题目标明的depth为1的情况。
typedef struct TreeNode TN;
void _addOneRow(TN* root,int val,int depth)
{
if(!root)
return;
if(depth==2)//在第depth层插入结点
{
TN* newnode1 = (TN*)malloc(sizeof(TN));
TN* newnode2 = (TN*)malloc(sizeof(TN));
newnode1->val = newnode2->val = val;
newnode1->left = root->left;
newnode1->right = NULL;
newnode2->right = root->right;
newnode2->left = NULL;
root->left = newnode1;
root->right = newnode2;
return;
}
//深度优先遍历
_addOneRow(root->left,val,depth-1);
_addOneRow(root->right,val,depth-1);
}
struct TreeNode* addOneRow(struct TreeNode* root, int val, int depth)
{
if(depth==1)//depth为1的特殊情况
{
TN* newroot = (TN*)malloc(sizeof(TN));
newroot->val = val;
newroot->left = root;
newroot->right = NULL;
return newroot;
}
_addOneRow(root,val,depth);
return root;
}