二叉搜索树的第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 }