16 合并两个排序的链表

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

示例

输入

1
{1,3,5},{2,4,6}

输出

1
{1,2,3,4,5,6}

思路:

比较两个链表当前指针值的大小,小的那个加到新链表中,指针后移。循环遍历只要有一个链表为空,将剩下的链表添到新链表后面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
ListNode node(0);
ListNode *res=&node;
while(pHead1!=nullptr&&pHead2!=nullptr){
if(pHead1->val<pHead2->val){
res->next=pHead1;
pHead1=pHead1->next;
}
else{
res->next=pHead2;
pHead2=pHead2->next;
}
res=res->next;
}
res->next=pHead1==nullptr?pHead2:pHead1;
return node.next;
}
};

17 树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

示例

输入

1
{8,8,#,9,#,2,#,5},{8,9,#,2}

输出

1
true

思路:

俩个树都不为空的时候开始比较,遍历pRoot1树的每一个节点找到值和pRoot2相同的节点

根节点值相同后开始比较,若其左右子树都相同则返回true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
bool res=false;
if(pRoot1==nullptr||pRoot2==nullptr)return res;
if(pRoot1->val==pRoot2->val){
res=isSubTree(pRoot1, pRoot2);
}
if(!res){
return HasSubtree(pRoot1->left,pRoot2)
||HasSubtree(pRoot1->right,pRoot2);
}
return res;
}

bool isSubTree(TreeNode* pRoot1, TreeNode* pRoot2){
if(pRoot2==nullptr)return true;
if(pRoot1==nullptr)return false;
if(pRoot1->val==pRoot2->val){
return isSubTree(pRoot1->left,pRoot2->left)
&&isSubTree(pRoot1->right, pRoot2->right);
}
else return false;
}
};

18 二叉树的镜像

题目描述

操作给定的二叉树,将其变换为源二叉树的镜像。

1
2
3
4
5
6
7
8
9
10
11
12
比如:    源二叉树 
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5

思路:

翻转节点的左右子树,递归调用函数确保每一个节点的左右子树都做出互换。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
TreeNode* Mirror(TreeNode* pRoot) {
if(pRoot==nullptr)return nullptr;
TreeNode *temp=pRoot->left;
pRoot->left=pRoot->right;
pRoot->right=temp;
Mirror(pRoot->left);
Mirror(pRoot->right);
return pRoot;
}
};