二叉搜索树的第k个结点 - Java

32 篇文章 0 订阅
28 篇文章 0 订阅

二叉搜索树的第k个结点 - Java

题目描述

给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。

输入
{5,3,7,2,4,6,8},3
返回值
{4}
说明
按结点数值大小顺序第三小结点的值为4  
思路

首先先了解二叉搜索树的定义,二叉搜索树又称二叉查找树,二叉排序树

它是一棵空树,或者是具有下列性质的二叉树

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的结点。

我们可以得知,左节点是最小的,每次都要遍历左节点,当左节点为空时,再去查右节点。

如下:

		{5,3,7,2,4,6,8}二叉树
            5
           /  \
          3    7
         / \  / \
        2  4 6   8

将5,3,2依次入栈,此时2的左节点为空,2出栈,计数器减1,2的右节点为空,3出栈,计数器减1,3的右节点不空入栈,左节点空,再出栈,计数器减1,4的右节点空,5出栈…依次下去,直到计数器为0。

实现Implementation
public class Solution {
    TreeNode KthNode(TreeNode pRoot, int k)
    {
        if(pRoot == null || k <= 0){
            return null;
        }
        Stack<TreeNode> stack = new Stack<>(); //建立栈
        TreeNode cur = pRoot;
        //while 部分为中序遍历
        while(!stack.isEmpty() || cur != null){
            if(cur != null){
                stack.push(cur); //将所有的左节点入栈,直到最左节点(最小值)
                cur = cur.left;
            }else{
                cur = stack.pop();//当前节点null则弹出栈内元素,相当于按顺序输出最小值。
                if(--k == 0){ //计数器功能
                    return cur;
                }
                cur = cur.right; // 左节点已经算了,到右节点
            }
        }
        return null;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一种常见的数据构,由节点和边组成。每个节点最多有两个子节点,分别称为左子节点和右子节点。 创建二的方法有多种。一种常用的方法是使用链式存储构,即每个节点含有数据和指向左右子节点的指针。我们可以通过递归的方式创建二。 首先,我们需要定义一个二节点的构,包括数据和左右子节点的指针。然后,按照二的性质,递归地创建节点。具体步骤如下: 1. 创建一个根节点,将根节点的数据填入。 2. 如果输入数据为空,表示当前节点为叶子节点,返回。 3. 从输入数据中取出左子节点的数据。 4. 创建左子节点,并将其指针赋值给根节点的左子节点指针。 5. 递归地调用创建二的函数,将左子节点作为参数。 6. 从输入数据中取出右子节点的数据。 7. 创建右子节点,并将其指针赋值给根节点的右子节点指针。 8. 递归地调用创建二的函数,将右子节点作为参数。 当所有节点都创建完成后,我们就得到了一颗二。可以根据需要对二进行遍历、插入、删除等操作。 需要注意的是,在创建二时,输入数据需要按照特定的规则进行排序,以满足二的性质。例如,如果输入数据是升序排列的,则创建出的二将是一个平衡二搜索。 所以,创建二的过程就是递归地将输入数据分配到每个节点,并按照二的性质建立节点之间的连接关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值