码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-02-24 00:25:31      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:nod   tar   数组   ==   条件   ||   art   合并有序链表   col   

判断树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,合并有序链表,旋转打印二维数组

标签:nod   tar   数组   ==   条件   ||   art   合并有序链表   col   

原文地址:https://www.cnblogs.com/void-lambda/p/12355166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!