剑指offer26-27解题思路及代码(搜索二叉树转双向链表、字符串排序)

剑指offer26-27解题思路及代码(搜索二叉树转双向链表、字符串排序)_第1张图片
26 搜索二叉树转双向链表

解这题首先要知道二叉搜索树的左节点小于其右节点,所以最小元素一定在最左边,而搜索树中其左子树最右节点为最大的数,即需要将其左子树最右值和根节点相链接,而将右子树最左节点和根相链接,然后递归出结果,代码如下:
class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree){
        TreeNode* pListNode=NULL;
        ConvertNode(pRootOfTree,&pListNode);
        TreeNode* pHead=pListNode;
        while(pHead&&pHead->left)
            pHead=pHead->left;
        return pHead;
    }
    void ConvertNode(TreeNode* pRootOfTree,TreeNode** pListNode){
        if(pRootOfTree==NULL)
            return;
        TreeNode* pNode=pRootOfTree;
        if(pNode->left)
            ConvertNode(pNode->left,pListNode);
        pNode->left=*pListNode;
        if(*pListNode!=NULL)
            (*pListNode)->right=pNode;
        *pListNode=pNode;
        if(pNode->right)
            ConvertNode(pNode->right,pListNode);
    }
};
剑指offer26-27解题思路及代码(搜索二叉树转双向链表、字符串排序)_第2张图片
27 字符串排序
该题思路主要先将字符串分为2部分一部分为第一个字母,另一部分为后面的字符串,然后将后面字符串排序以后,然后将第一个字符串和后面交换位置。所以现根据该思路写了下面的代码:
class Solution {
public:
    vector answer;
    vector Permutation(string str) {
        if(str.empty())
            return answer;
        int i=0;
        Permuate(str,i);
        return answer;
    }
    void Permuate(string str,int i){
        if(i==str.size())
            answer.push_back(str);
        for(int j=i;j
但是发现对于aa这种情况会出现重复插入得情况,所以添加判断语句:
if(j!=i&&str[i]==str[j])
                continue;
然后按理应该算是对了,不过牛客判断得时候还考虑到排序得问题所以最后对answer进行sort一下就能得到结果。最后代码:
class Solution {
public:
    vector answer;
    vector Permutation(string str) {
        if(str.empty())
            return answer;
        int i=0;
        Permuate(str,i);
        sort(answer.begin(),answer.end());
        return answer;
    }
    void Permuate(string str,int i){
        if(i==str.size())
            answer.push_back(str);
        for(int j=i;j


你可能感兴趣的:(剑指offer26-27解题思路及代码(搜索二叉树转双向链表、字符串排序))