一、树的子结构
1.链接
树的子结构_牛客题霸_牛客网 (nowcoder.com)
2.描述
给两颗二叉树A B,判断B是不是A的子结构
3.思路
将问题拆解开来,首先是找到a树中子结构的位置,然后是判断是否相同,也就是说,我们需要去遍历一边a树,逐一把每个节点作为根去和b的根进行判断是否相同,如果相同,则说明确实是子结构,此外,题目还要求,空树不属于任何树的子结构
4.参考代码
ps:一开始理解错了子结构的意思,理解成子树了,所以判断是否子结构的函数名字写的是is_same
class Solution
{
public:bool is_same(TreeNode* A, TreeNode* B){if(B == nullptr){return true;}if(A == nullptr){return false;}if(A->val != B->val){return false;}return is_same(A->left, B->left) && is_same(A->right, B->right);}bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {if(pRoot1 == nullptr || pRoot2 == nullptr){return false;}bool ret = is_same(pRoot1, pRoot2);if(ret){return true;}else{return HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right,pRoot2);}}
};
二、二叉树的镜像
1.链接
二叉树的镜像_牛客题霸_牛客网 (nowcoder.com)
2.描述
操作给定的二叉树,将其变换为源二叉树的镜像。
3.思路
通过观察发现,镜像后就是原二叉树每个节点的左右子树交换,因此很容易想到,用递归的方法遍历每个节点,然后去将每个节点的左右子树交换,遇到空则返回
4.参考代码
class Solution {
public:TreeNode* Mirror(TreeNode* pRoot) {if(pRoot == nullptr){return nullptr;}TreeNode* tmp = pRoot->left;pRoot->left = pRoot->right;pRoot->right = tmp;Mirror(pRoot->left);Mirror(pRoot->right);return pRoot;}
};
三、删除链表重复节点
1.链接
删除链表中重复的结点_牛客题霸_牛客网 (nowcoder.com)
2.描述
给一个单链表,要求删掉所有重复的区间,一个不留,然后返回
3.思路
4.参考代码
class Solution {
public:ListNode* deleteDuplication(ListNode* pHead) {if(pHead == nullptr){return nullptr;}ListNode* newhead = new ListNode(0);newhead->next = pHead;ListNode* fast = pHead;ListNode* slow = newhead;while(fast){while(fast->next && fast->val != fast->next->val){fast = fast->next;slow = slow->next;}while(fast->next && fast->val == fast->next->val){fast = fast->next;}if(slow->next != fast){slow->next = fast->next;}fast = fast->next;}ListNode* ret = newhead->next;delete newhead;return ret;}
};
总结
这次的总结前两题主要考递归和对二叉树的控制,第三题考验的是对单链表的控制和对边界条件的考虑。