LeetCode 热题 100(六):25. K 个一组翻转链表、230. 二叉搜索树中第K小的元素、199. 二叉树的右视图

题目一:

25. K 个一组翻转链表https://leetcode.cn/problems/reverse-nodes-in-k-group/题目要求:

LeetCode 热题 100(六):25. K 个一组翻转链表、230. 二叉搜索树中第K小的元素、199. 二叉树的右视图_第1张图片

 思路:建立虚拟头结点,并采用头尾节点,使用常规翻转的函数进行翻转。 具体见代码逻辑。

注意:一定注意好翻转后的尾结点和下一组的头结点,以便建立连接。同时注意翻转后的左右边界和更新左右边界问题。

代码:

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        // 1. 建立虚拟头结点
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        // 2.令start = end = dummy  作为一组的头结点和尾节点
        ListNode start = dummy, end = dummy;
        while (true){
            // 3.先确定下当前组是否需要翻转,如果end = null 说明已经是最后几个元素但不构成一组了
            for (int i = 0; i < k && end != null; i++)
                end = end.next;
            if (end == null) break;
            // 4.确定需要翻转了, 先记录下翻转后的头结点startNext 和 下一组的头结点endNext  方便连起来
            ListNode startNext = start.next;
            ListNode endNext = end.next;
            // 5.把当前组暂时隔离起来
            end.next = null;
            // 6.使用自定义函数reverse进行翻转, 确定翻转后的左边界start.next
            start.next = reverse(start.next);
            // 7.确定右边界且与下一组的头结点连接上
            startNext.next = endNext;
            // 8.更新下左右边界
            start = end = startNext;
        }
        return dummy.next;

    }
    // 翻转  eg.  1->2->3   翻转为  1<-2<-3
     ListNode reverse(ListNode head){
        ListNode cur = head, pre = null;
        while (cur != null){
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

题目二:

230. 二叉搜索树中第K小的元素icon-default.png?t=N6B9https://leetcode.cn/problems/kth-smallest-element-in-a-bst/LeetCode 热题 100(六):25. K 个一组翻转链表、230. 二叉搜索树中第K小的元素、199. 二叉树的右视图_第2张图片

思路:直接利用二叉搜索树的顺序关系,利用中序遍历进行获取即可

代码:

class Solution {
    public int kthSmallest(TreeNode root, int k) {
        Stack stack = new Stack<>();
        TreeNode cur = root;
        while (!stack.isEmpty() || cur != null){
            if (cur != null){
                stack.push(cur);
                cur = cur.left;
            }else {
                cur = stack.pop();
                k --;
                if (k == 0) break;
                cur = cur.right;
            }
        }
        return cur.val;
    }
}

 题目三:

199. 二叉树的右视图icon-default.png?t=N6B9https://leetcode.cn/problems/binary-tree-right-side-view/LeetCode 热题 100(六):25. K 个一组翻转链表、230. 二叉搜索树中第K小的元素、199. 二叉树的右视图_第3张图片

 思路:利用层序遍历,找到每次遍历的最后一个节点,就一定是最右边的结点。

代码:

class Solution {
    public List rightSideView(TreeNode root) {
    List list = new ArrayList<>();
    Deque queue = new LinkedList<>();
    if (root != null) {
        queue.offer(root);
    }
    while (!queue.isEmpty()) {
        int len = queue.size();
        TreeNode lastNode = null;  // 记录当前层的最后一个节点
        while (len-- > 0){
                TreeNode cur = queue.poll();
                lastNode = cur;
                // 最后一次循环时,就一定到达了最右边上的节点  add值即可
                if (len == 0) list.add(cur.val);
                if (cur.left != null) queue.offer(cur.left);
                if (cur.right != null) queue.offer(cur.right);
            }    
        }
    return list;
    }
}

你可能感兴趣的:(力扣刷题,leetcode,链表,算法)