【每日刷题】Day69

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

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值