剑指offer-判断树1中是否有树2,合并有序链表,旋转打印二维数组

Posted void-lambda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer-判断树1中是否有树2,合并有序链表,旋转打印二维数组相关的知识,希望对你有一定的参考价值。

判断树1中是否有树2

思路:

采用递归的方法,先序遍历整棵树,判断当前的树是否有树2,没有的话判断左右子树是否有。

代码:

bool Tree2InTree1(TreeNode *root1, TreeNode *root2)
{
    if (root1 == NULL)
        return false;
    if (root2 == NULL)
        return true;
    if (root1->v == root2->v)
    {
        return Tree2InTree1(root1->left, root2->left) && Tree2InTree1(root1->right, root2->right);
    }
    else
    {
        return false;
    }
    
}
bool Inorder(TreeNode *root1, TreeNode *root2)
{
    bool res = false;
    if (root1 != NULL && root2 != NULL)
    {
        res = Tree2InTree1(root1, root2);
        if (!res)
        {
            res = Inorder(root1->left, root2);
        }
        if (!res)
        {
            res = Inorder(root1->right, root2);
            return res;
        }
    }

合并有序链表

思路:

采用递归的方式,每一次都是小的那个节点作为头结点,并且将头结点连接到已排好的节点。

代码:

ListNode* MergeList(ListNode* l1,ListNode*l2)
{
    if(l1==NULL&&l2!=NULL)
    {
        return l2;
    }
    else if(l1!=NULL&&l2==NULL)
    {
        return l1;
    }
    else if(l1==NULL&&l2==NULL)
    return NULL;
    ListNode *head=NULL;
    if(l1->v<l2->v)
    {
        head=l1;
        head->next=MergeList(l1->next,l2);
    }
    else
    {
        head=l2;
        head->next=MergeList(l1,l2->next);
    }
    return head;
}

旋转打印二维数组

思路:

将打印数组一圈作为一个循环,每次循环的坐标都从左上角开始。循环满足的条件是startx2<cols和starty2<rows。打印一圈这个操作也要分情况。向右打印都有,向下打印至少有两行,向左打印满足前面的条件下至少要有两列,最后一步向上打印至少要有3行。

代码:

void PrintNumber(int n)
{
    cout << n << ' ';
}
void PrintCircle(int **arr, int rows, int cols, int start)
{
    int endX = cols - 1 - start;
    int endY = rows - 1 - start;
    // 从左到右打印一行
    for (int i = start; i <= endX; ++i)
    {
        int number = arr[start][i];
        PrintNumber(number);
    }
    // 从上到下打印一列
    if (start < endY)
    {
        for (int i = start + 1; i <= endY; ++i)
        {
            int number = arr[i][endX];
            PrintNumber(number);
        }
    }
    // 从右到左打印一行
    if (start < endX && start < endY)
    {
        for (int i = endX - 1; i >= start; --i)
        {
            int number = arr[endY][i];
            PrintNumber(number);
        }
    }
    // 从下到上打印一行
    if (start < endX && start < endY - 1)
    {
        for (int i = endY - 1; i >= start + 1; --i)
        {
            int number = arr[i][start];
            PrintNumber(number);
        }
    }
}
void PrintMatrix(int **arr, int rows, int cols)
{
    if (arr == NULL || rows <= 0 || cols <= 0)
    {
        return;
    }
    int start = 0;
    while (start * 2 <= rows && start * 2 <= cols)
    {
        PrintCircle(arr, rows, cols, start);
        start++;
    }
}

以上是关于剑指offer-判断树1中是否有树2,合并有序链表,旋转打印二维数组的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer 17:合并两个有序链表

剑指offer-面试题25-合并两个排序的链表-链表

剑指offer:合并两个排序的链表

《剑指Offer》题目:合并两个排序的链表

LeetCode JavaScript实现 合并链表 题型汇总

LeetCode Algorithm 剑指 Offer 25. 合并两个排序的链表