树7:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
二叉搜索树的特点、查找、插入、删除、建立空树:
https://www.cnblogs.com/LydiammZuo/p/11893982.html
1.递归(用二叉树的中序遍历)
/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { int count=0;//计数器:当前访问了多少个结点 TreeNode KthNode(TreeNode pRoot, int k) { if(pRoot!=null){ //中序遍历寻找第k个 TreeNode node1=KthNode(pRoot.left,k);//左子树分支总返回给node1 if(node1!=null) return node1;//将node1 return给上一层 if(++count==k) return pRoot;//找到了第k小的结点 TreeNode node2=KthNode(pRoot.right,k);//右子树分支总返回给node2 if(node2!=null) return node2; } return null;//向上一层返回 } }
2.非递归中序遍历
import java.util.*; public class Solution { TreeNode KthNode(TreeNode root, int k) { int count=0; if(root==null) return null; Stack<TreeNode>s=new Stack<>(); TreeNode p=root; while(!s.isEmpty()||p!=null){ if(p!=null){//根结点入栈、其左孩子存在则入栈 s.push(p); p=p.left; } else {//栈不空的情况下出栈 p=s.pop(); if(++count==k) return p;//找到了第k小的结点就返回 p=p.right;//每次出栈都判断下该出栈节点的右孩子是否存在,存在则入栈 } } return null; } }
本文来自博客园,作者:冰河入梦~,转载请注明原文链接:https://www.cnblogs.com/xuechengmeigui/p/12654371.html