zoukankan      html  css  js  c++  java
  • 剑指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++;
    	}
    }
    
  • 相关阅读:
    ADT上跑java application
    GIT 用RSA加密方式来记住密码
    android中listView下有Button按钮始终在最底部
    Android学习:导入工程时报错The import android cannot be resolved
    Preference的使用
    MySQL查询时,查询结果如何按照where in数组排序
    MySQL创建民族表的SQL语句
    PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现
    使用file_get_contents()和curl()抓取网络资源的效率对比
    常用正则表达式整理(持续更新中)
  • 原文地址:https://www.cnblogs.com/void-lambda/p/12355166.html
Copyright © 2011-2022 走看看