剑指offer/56-60

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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值