面试题54 二叉搜索树的第k大节点。2星

#给定一棵二叉搜索树,请找出其中第k大的节点。

#示例:输入: root = [3,1,4,null,2], k = 1
3
/
1 4

2
输出: 4

输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/
3 6
/
2 4
/
1
输出: 4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:

import java.util.*;
public class TNfindmaxkpoint {
    public int kthLargest(TreeNode root, int k) {
        int maxk = 0;//记录返回值
        List<Integer> list = new ArrayList<>();//存放遍历的值
        Deque<TreeNode> queue = new LinkedList<>();//顺序遍历的队列
        queue.offer(root);
        TreeNode node = root;
        while(!queue.isEmpty()){
            node = queue.poll();
            list.add(node.val);
            if(node.left != null){queue.add(node.left);}
            if(node.right != null){queue.add(node.right);}
        }
        Collections.sort(list,Collections.reverseOrder());
        maxk = list.get(k-1);
        return maxk;
    }
}

初次写的代码,速度较慢。
以上为采用顺序遍历的方法,寻找maxk值。
顺序遍历利用队列先进后出的方式来辅助搜索。先将根节点入队列,进循环,当队列不为空的时候,队首元素出队列,并将数据域加入到list中,并将该元素的左右节点依次入队列(左或右节点存在的情况下)。循环结束后list列表将获得二叉树的所有节点的数据域。再调用Collections.sort()方法对list进行排序,最后得到想要的maxk值。
其中:offer()方法为入队,poll()方法为出队并返回节点。
Collections.sort()方法,如果单一个list参数,排序方式为从小到大,而再加上参数Collections.reverseOrder()后排序为从大到小。

方法二:

import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

public class TNfindmaxkpoint2 {
    public int kthLargest(TreeNode root,int k){
        List<Integer> result = new LinkedList<>();//存放遍历出来的值
        Stack<TreeNode> stack = new Stack<>();//中序遍历使用的栈
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.push(cur);//入栈
                cur = cur.right;
            }
            cur = stack.pop();//出栈
            result.add(cur.val);
            cur = cur.left;
        }
        return result.get(k-1);
    }
}

学习别人的代码,不过速度也较慢,但比上一种方法有提升。
以上为中序遍历从右向左的方法寻找maxk值。
cur变量指向当前遍历的节点,首先令cur指向根节点,进循环,当cur和stack栈都不为空的情况下,再进一个内循环,当cur不为null的情况下将cur入栈,cur再指向其右节点。当没有最右的节点的情况下,栈顶出栈,并将栈顶的数据域加入到result列表中,再令cur指向其左节点(遍历完右子树和根,开始遍历左子树),最后遍历完所有节点后返回想要的maxk值。

注意:因为测试例题中给出的二叉树是存在规律的,如果采用中序从右向左遍历所的到的遍历结果刚好是从大到小的序列。

方法三:
对方法二,根据注意的改写,在遍历到第k个值时直接返回。

import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

public class TNfindmaxkpoint2 {
    public int kthLargest(TreeNode root,int k){
        List<Integer> result = new LinkedList<>();//存放遍历出来的值
        Stack<TreeNode> stack = new Stack<>();//中序遍历使用的栈
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.push(cur);//入栈
                cur = cur.right;
            }
            cur = stack.pop();//出栈
            result.add(cur.val);
            cur = cur.left;
        }
        return result.get(k-1);
    }
}
发布了18 篇原创文章 · 获赞 0 · 访问量 336

猜你喜欢

转载自blog.csdn.net/qq_44787671/article/details/104429367