前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指Offer-二叉搜索树的第k个结点

剑指Offer-二叉搜索树的第k个结点

作者头像
武培轩
发布2018-04-18 17:08:42
7800
发布2018-04-18 17:08:42
举报
文章被收录于专栏:武培轩的专栏武培轩的专栏

题目描述

给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 /  3 7 / / 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

思路

利用二叉搜索数中序遍历有序的特点。

用递归和迭代分别实现中序遍历。

代码实现

代码语言:javascript
复制
package Tree;

import java.util.Stack;

/**
 * 二叉搜索树的第k个结点
 * 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
 * 思路:
 * 利用二叉搜索数中序遍历有序的特点。
 */
public class Solution49 {
    private int cnt;
    private TreeNode res;

    /**
     * 迭代中序遍历
     *
     * @param pRoot
     * @param k
     * @return
     */
    TreeNode KthNode_2(TreeNode pRoot, int k) {
        if (pRoot == null || k == 0)
            return null;
        int cnt = 0;
        Stack<TreeNode> stack = new Stack<>();
        while (pRoot != null || !stack.isEmpty()) {
            while (pRoot != null) {
                stack.push(pRoot);
                pRoot = pRoot.left;
            }
            pRoot = stack.pop();
            cnt++;
            if (cnt == k) return pRoot;
            pRoot = pRoot.right;
        }
        return null;
    }

    TreeNode KthNode(TreeNode pRoot, int k) {
        inOrder(pRoot, k);
        return res;
    }

    /**
     * 递归中序遍历
     *
     * @param pRoot
     * @param k
     */
    void inOrder(TreeNode pRoot, int k) {
        if (pRoot == null) return;
        if (cnt > k) return;
        inOrder(pRoot.left, k);
        cnt++;
        if (cnt == k) res = pRoot;
        inOrder(pRoot.right, k);
    }

    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;

        }

    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档