24. 两两交换链表中的节点
题目描述:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
思路分析:
1.链表和树的结构很适合递归,可以往这方面去想。
2.递归首先先想着结束的条件是啥。
3.之后本级递归需要返回什么。
4.抱着以上两点,看注释
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head==NULL||head->next==NULL)
{
return head;
}
ListNode* next=head->next;
head->next=swapPairs(head->next->next);
next->next=head;
return next;
}
};
226. 翻转二叉树
题目描述:
翻转一棵二叉树。
思路分析:
1.当head为空的时候,返回
2.交换节点,左右节点交换
3.返回翻转后的头结点
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(!root)
{
return root;
}
TreeNode* treeleft=invertTree(root->left);
TreeNode* treerigth=invertTree(root->right);
root->right=treeleft;
root->left=treerigth;
return root;
}
};
101. 对称二叉树
题目描述:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/
2 2
/ /
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/
2 2
3 3
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return judge(root->left,root->right);
}
bool judge(TreeNode* p,TreeNode* q)
{
if(p==NULL&&q==NULL)return true;
if(p==NULL||q==NULL)return false;
if(p->val==q->val&&judge(p->left,q->right)&&judge(p->right,q->left))
{
return true;
}
return false;
}
};