合并两个排序链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
//递归
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null)
return list2;
if(list2 == null)
return list1;
ListNode res = null;
if(list1.val <= list2.val){
res = list1;
list1.next = Merge(list1.next,list2);
}
else{
res = list2;
list2.next = Merge(list1,list2.next);
}
return res;
}
}
//非递归
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null)
return list2;
if(list2 == null)
return list1;
ListNode mergeNode = new ListNode(-1);
ListNode current = mergeNode;
while(list1 != null && list2 != null){
if(list1.val < list2.val){
current.next = list1;
list1 = list1.next;
}else{
current.next = list2;
list2 = list2.next;
}
current = current.next;
}
if(list1 == null) current.next = list2;
if(list2 == null) current.next = list1;
return mergeNode.next;
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL)
return pHead2;
else if(pHead2==NULL)
return pHead1;
ListNode* newhead=NULL;
if(pHead1->val<pHead2->val)
{
newhead=pHead1;
newhead->next=Merge(pHead1->next,pHead2);
}
else
{
newhead=pHead2;
newhead->next=Merge(pHead1,pHead2->next);
}
return newhead;
}
};
树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null){
return false;
}
//如果找到与子树相同根的值,走判断方法
if(root1.val == root2.val){
if(judge(root1,root2)){
return true;
}
}
//遍历左孩子,右孩子
return HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
//判断是否是子结构
public boolean judge(TreeNode root, TreeNode subtree) {
//子结构已经循环完毕,代表全部匹配
if(subtree == null){
return true;
}
//大树已经循环完毕,并未成功匹配
if(root == null){
return false;
}
//相等后判断左右孩子
if(root.val == subtree.val){
return judge(root.left, subtree.left) && judge(root.right, subtree.right);
}
return false;
}
}
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1==NULL||pRoot2==NULL)
return false;
if(pRoot1->val==pRoot2->val)
{
if(IsSub(pRoot1,pRoot2))
return true;
}
return HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2);
}
bool IsSub(TreeNode *p1,TreeNode *p2)
{
if(p2==NULL)
return true;
if(p1==NULL)
return false;
if(p1->val!=p2->val)
return false;
return IsSub(p1->left,p2->left)&&IsSub(p1->right,p2->right);
}
};
镜像二叉树
操作给定的二叉树,将其变换为源二叉树的镜像。
// 递归
public class Solution {
public void Mirror(TreeNode root) {
if(root == null)
return ;
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
Mirror(root.left);
Mirror(root.right);
}
}
// 非递归
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
public void Mirror(TreeNode root) {
if(root == null) return;
Queue<TreeNode> nodes = new LinkedList<>();
TreeNode curr, temp;
nodes.offer(root);
while(!nodes.isEmpty()){
curr = nodes.poll();
temp = curr.left;
curr.left = curr.right;
curr.right = temp;
if(curr.left != null) nodes.offer(curr.left);
if(curr.right != null) nodes.offer(curr.right);
}
}
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if (pRoot == NULL)
return;
TreeNode *pTmp;
pTmp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = pTmp;
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};