二叉查找树的第K个节点

题目
给定一颗二叉搜索树,请找出其中的第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));
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值