编程之旅-Day11

目录

Day11-学习内容

1.剑指Offer

面试题36:二叉搜索树与双向链表

面试题38:字符串的排列(书上解法暂未调试通过)

2.Leetcode

例1:找出所有被X包围的区域,并将其中的‘O’全部替换为‘X’.(自己编写的代码暂未调试通过)

例2:合并两个已排序的数组到其中一个已排序的数组中


1.剑指Offer

面试题36:二叉搜索树与双向链表

题目描述:

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

思路:中序遍历+递归实现

书上解法:

class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        TreeNode* pLastNodeinList=nullptr;
        ConvertNode(pRootOfTree,&pLastNodeinList);
        
        TreeNode* pHeadofList=pLastNodeinList;
        while(pHeadofList!=nullptr&&pHeadofList->left!=nullptr){
            pHeadofList=pHeadofList->left;
        }
        return pHeadofList;
    }
    void ConvertNode(TreeNode* pRootOfTree,TreeNode** pLastNodeinList){
        if(pRootOfTree==nullptr){
            return;
        }
        
        TreeNode* pCurrent=pRootOfTree;
        if(pCurrent->left){
            ConvertNode(pCurrent->left,pLastNodeinList);
        }
        pCurrent->left=*pLastNodeinList;
        if(*pLastNodeinList){
            (*pLastNodeinList)->right=pCurrent;
        }
        pCurrent=*pLastNodeinList;
        if(pCurrent->right){
            ConvertNode(pCurrent->right,pLastNodeinList);
        }
    }
};

牛客网调试出现数组和指针越界问题,暂时没有想出解决方案,后面在修改。

正确代码:(已调试通过!)

class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree==nullptr) return nullptr;
        TreeNode* pre=nullptr;
        ConvertNode(pRootOfTree,pre);
        
        TreeNode* pHead=pRootOfTree;
        while(pHead->left){
             pHead=pHead->left;
        }
        return pHead;
    }
    void ConvertNode(TreeNode* cur,TreeNode*& pre){
        if(cur==nullptr) return;
        ConvertNode(cur->left,pre);
        cur->left=pre;
        if(pre){
            pre->right=cur;
        }
        pre=cur;
        ConvertNode(cur->right,pre);
    }
};

面试题38:字符串的排列

题目描述:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值