判断树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++;
}
}