56、删除链表中重复的节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
package M56TO60;
import M10TO15.ListNode;
import java.util.HashSet;
public class SoluDeleteDuplication {
/*
1. 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况
2.设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索
*/
public ListNode deleteDuplication(ListNode pHead) {
if (pHead==null || pHead.next==null){return pHead;}
//新建节点当作头结点
ListNode head = new ListNode(0);
//Head指向第一个节点
head.next = pHead;
ListNode pre = head;
ListNode last = head.next;
while (last!=null){
//当下一个节点不为空,且下一个节点的值等于last指向节点时
if(last.next!=null && last.val == last.next.val){
// 找到最后的一个相同节点
while (last.next!=null && last.val == last.next.val){
last = last.next;
}
//此时last指向的是最后一个相同的节点,让pre指向last的下一个节点,则删除了这个重复的节点
pre.next = last.next;
last = last.next;
}else{
//没有重复节点则向后移动
pre = pre.next;
last = last.next;
}
}
//返回链表不重复的节点,即head.next
return head.next;
}
}
57、二叉树的下一个节点
题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
package M56TO60;
import java.util.ArrayList;
public class SoluGetNext {
public TreeLinkNode GetNext(TreeLinkNode pNode){
/**
*关键信息是:此树结构包含指向父结点的next指针。
**/
if(pNode==null) return null;
//存在右分支,下一个节点是右子树先序遍历第一个
if (pNode.right !=null){
TreeLinkNode p = pNode.right;
while (p.left !=null) p = p.left;
return p;
}
//如果右子树是空的
else{
TreeLinkNode parent = pNode.next;
//右子树为空且是父节点的左子树,则它的下一个节点是它的父亲节点
if (parent==null||parent.left==pNode) return parent;
//右子树为空且是父节点的右子树,则其下一个节点是它的祖先节点,
// 且其在祖先节点的左子树上(如果祖先节点都没有左子树在,则下一个节点就是空)
else{
TreeLinkNode granparent = parent.next;
while (granparent!=null&& granparent.left!=parent){
parent = granparent;
granparent = granparent.next;
}
return granparent;
}
}
}
}
58、判断是否对称树
即依次比较左子树的左孩子和右子树的右孩子是否相等。且左子树的右孩子和右子树的左孩子是否相等。都相等则是对称树
package M56TO60;
import M16TO20.TreeNode;
public class SoluisSymmetrical {
boolean isSymmetrical(TreeNode pRoot){
if (pRoot ==null) return true;
else return isDuichen(pRoot.left,pRoot.right);
}
private boolean isDuichen(TreeNode leftNode,TreeNode righNode){
if (leftNode==null && righNode==null) return true;
if (leftNode==null||righNode==null) return false;
if (leftNode.val==righNode.val){
return isDuichen(leftNode.left,righNode.right)&&isDuichen(leftNode.right,righNode.left);
}else{
return false;
}
}
}
59、按之字形顺序打印二叉树
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
层次遍历进阶版
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if(root==null) return ans;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int flag = 1;
while(!queue.isEmpty()){
List<Integer> list = new ArrayList<>();
int size = queue.size();
if((flag&1)==1){
for(int i=0;i<size;i++){
TreeNode temp = queue.poll();
list.add(temp.val);
if(temp.left!=null) queue.offer(temp.left);
if(temp.right!=null) queue.offer(temp.right);
}
}else{
for(int i=0;i<size;i++){
TreeNode temp = queue.poll();
list.add(0,temp.val);
if(temp.left!=null) queue.offer(temp.left);
if(temp.right!=null) queue.offer(temp.right);
}
}
flag++;
ans.add(list);
}
return ans;
}
}
60、把二叉树打印成多行
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
层次遍历!(队列)
package M56TO60;
import M16TO20.TreeNode;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class SoluPrint2 {
ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if (pRoot==null) return res;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(pRoot);
while (!queue.isEmpty()){
ArrayList<Integer> list = new ArrayList<>();
int len = queue.size();
for (int i=0;i<len;i++){
TreeNode tempNode = queue.poll();
list.add(tempNode.val);
if (tempNode.left!=null) queue.offer(tempNode.left);
if (tempNode.right !=null) queue.offer(tempNode.right);
}
res.add(list);
}
return res;
}
}