题目
给定一颗二叉搜索树,请找出其中的第k小的结点。
二叉搜索树
二叉搜索树,是指一棵空树或者具有下列性质的二叉树:
1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
3. 任意节点的左,右子树也分别为二叉搜索树;
4. 没有键值相等的节点。
解题思路
首先这个是一颗二叉搜索树,我只需要是的这个这颗二叉搜索树进行排序,然后找到第k个就可以了,那个我们都知道二叉搜索树的中序遍历是一个有顺序的序列,这个时候我就是要中序遍历这颗二叉树,然后设置一个变量,访问一个变量的时候就加一,判断这个变量和k是否相等,如果相等,则将当前的这个结点返回即可。
如下图为一个二叉搜索树结构,中序遍历的结果为1,2,3,4,5,6,7
源代码
package Arithmetic;
public class KthNode {
class TreeNode {
private int val = 0;
private TreeNode left;
private TreeNode right;
public TreeNode(int val) {
this.val = val;
}
@Override
public String toString() {
return this.val + "";
}
}
private TreeNode cnt;//保存第k个节点
private int ret = 0;//记录访问到第几个节点
public TreeNode KthNode(TreeNode root, int k) {
inOrder(root, k);
return cnt;
}
private void inOrder(TreeNode root, int k) {
if (root == null || ret >= k)//访问到第k个节点直接返回
return;
inOrder(root.left, k);//访问根节点左子树
ret++;
if (ret == k)//判断是否访问到第k个节点
cnt = root;
inOrder(root.right, k);//访问根节点右子树
}
public static void main(String[] args) {
KthNode kthNode = new KthNode();
TreeNode treeNode4 = kthNode.new TreeNode(4);
TreeNode treeNode2 = kthNode.new TreeNode(2);
TreeNode treeNode6 = kthNode.new TreeNode(6);
TreeNode treeNode1 = kthNode.new TreeNode(1);
TreeNode treeNode3 = kthNode.new TreeNode(3);
TreeNode treeNode5 = kthNode.new TreeNode(5);
TreeNode treeNode7 = kthNode.new TreeNode(7);
treeNode4.left = treeNode2;
treeNode4.right = treeNode6;
treeNode2.left = treeNode1;
treeNode2.right = treeNode3;
treeNode6.left = treeNode5;
treeNode6.right = treeNode7;
System.out.println(kthNode.KthNode(treeNode4,4));
}
}