二叉搜索树的第k大节点

题目链接:
二叉搜索树的第k大节点 | 图解DFS | 最通俗易懂的题解 【c++/java版本】 - 二叉搜索树的第k大节点 - 力扣(LeetCode) (leetcode-cn.com)

二叉搜索树的概念:

左子树的所有结点小于头节点,头节点小于右子树的所有结点(对所有子树都有以下规律)

 

所以本题只需通过一个中序遍历就可以得到有序数列(因为本题是第k大,所以采用右中左的遍历方式)

代码:

 1 public int kthLargest(TreeNode root, int k) {
 2           Stack<TreeNode> sk = new Stack<>();
 3           while (sk.size() > 0 || root != null) {
 4               if (root!= null) {
 5                   sk.push(root);
 6                   root = root.right;
 7               }
 8               else {
 9                   root = sk.pop();
10                   k--;
11                   if (k == 0) {
12                       return root.val;
13                   }
14                   root = root.left;
15               }
16           }
17           return 0;
18       }

 

知识点补充:
判断一棵树是否为二叉树:
可以使用中序遍历,如果得到的中序遍历为升序序列,则是二叉搜索树

 

1.递归法:

 1 //法一:递归法中序遍历的实现
 2     public static boolean checkBST1(Node root) {
 3         if (root == null) {//当递归到空节点时,则认为前面的情况都符合了条件,所以返回true
 4             return true;
 5         }
 6         boolean isBst = checkBST1(root.left);//记录左子树得到的返回值结果
 7         if (!isBst) {//如果左子树已不满足二叉搜索树,则直接返回false,停止递归
 8             return false;
 9         }
10         if (preValue > root.val) {//如果树的递归过程中不满足值的递增关系,也返回false
11             return false;
12         }
13         else {//否则更新前一次中序遍历的值
14             preValue = root.val;
15         }
16         //如果左子树已经满足了条件,则只需要看右子树的结果即可
17         return checkBST1(root.right);
18     }

 

2.非递归法:

 1 //法二:非递归法中序遍历的实现
 2     public static boolean checkBST2(Node root) {
 3         if (root == null) {//处理到树为空的情况
 4             return true;
 5         }
 6         Stack<Node> sk = new Stack<>();
 7         while (sk.size() > 0 || root != null) {
 8             if (root != null) {
 9                 sk.push(root);
10                 root = root.left;
11             }
12             else {
13                 root = sk.pop();
14                 if (preValue > root.val) {
15                     return false;
16                 }
17                 else {
18                     preValue = root.val;
19                 }
20                 root = root.right;
21             }
22         }
23         return true;
24     }

 

posted @ 2022-04-12 18:43  jue1e0  阅读(95)  评论(0)    收藏  举报