剑指offer-二叉搜索树转化为双向链表,字符全排列,八皇后问题

感情迁移 提交于 2020-02-28 19:40:50

二叉搜索树转化为双向链表

思路:

二叉搜索树的中序遍历就是一个有序序列,对于根节点,当左子树有序之后,把它和左子树的最右节点链接起来。随后遍历右子树,第一个节点是右子树的最左节点,链接起来。

代码:

void ConvertRecursion(TreeNode* root, TreeNode** pLastNode)
{
    if (root == NULL)
    {
        return ;
    }
    TreeNode* currentNode = root;
    if (root->left)
    {
        ConvertRecursion(root->left, pLastNode);
    }
    currentNode->left = *pLastNode;   //开始链接根和左子树的最后一个节点。
    if (*pLastNode)
        (*pLastNode)->right = currentNode;   //*pLastNode为指针
    else
        cout << "LastNode is NULL" << endl;
    *pLastNode = currentNode; //最后一个指针指向当前节点
    if (currentNode->right)
    {
        ConvertRecursion(root->right, pLastNode);
    }

}
TreeNode* TreeConvertToList(TreeNode *root)
{
    if (root == NULL)
        return NULL;
    TreeNode* pLastNode = NULL;
    ConvertRecursion(root, &pLastNode); //传递的是指针的地址
    TreeNode* p = pLastNode;
    while (p&&p->left)
    {
        p = p->left;
    }
    return p;
}

字符全排列

思路:

递归思想,当前字符串分为字符和后面的字符串。每次都与后面的字符交换,用begin指针向后移动。当begin到末尾,递归结束。

代码:

void stringallrank1(string s1,int begin)
{
    if (begin == s1.size())
        cout << s1 << endl;
    else
    {
        for (int i =begin; i < s1.size(); i++)
        {
            char temp = s1[begin];
            s1[begin] = s1[i];
            s1[i] = temp;
            
            stringallrank1(s1, begin+1);
            //用的是string,递归回来时自动恢复,不用交换回来。
            
            
        }
    }

}
void stringallrank(string s)
{
    if (s.empty())
        return;
    stringallrank1(s,0);
}

八皇后问题

描述:

8X8的棋盘有8个棋子,要求棋子不能同行同列同对角线。求所有摆放个数。

思路:

arr[],下标代表棋子所在行数,值代表棋子所在列数,然后就是全排列问题。用0-7初始化数组,保证不同行同列。所以只用保证不同对角线。
代码:

bool check(int arr[], int len)
{
    for (int i = 0; i < len; i++)
    {
        for (int j = i + 1; j < len; j++)
        {
            if (j - i == abs(arr[i] - arr[j]))
            {
                return false;
            }
        }
    }
    return true;
}
void Permutation(int arr[], int len, int index,int *num)
{
    if (index == len)
    {
        if (check(arr, len))
        {
            (*num)++;
            /*for (int i = 0; i < len; i++)
            {
                cout << arr[i];
            }
            cout << ' ';*/
        }
    }
    for (int i = index; i < len; i++)
    {
        swap(arr[index], arr[i]);
        Permutation(arr, len, index + 1, num);
        swap(arr[index], arr[i]);  //传入的是数组,递归回来会变
    }
}
void eightqueue()
{
     int num = 0;
    int arr[8];
    for (int i = 0; i < 8; i++)
    {
        arr[i] = i;
    }
    Permutation(arr, 8, 0, &num);
    cout << num;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!