zoukankan      html  css  js  c++  java
  • 剑指Offer-二叉搜索树的第k个结点

    题目描述

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

    思路

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

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

    代码实现

    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;
    
            }
    
        }
    }
    
    
  • 相关阅读:
    bash脚本入门
    DNS 递归查询
    场景题
    利用 python 发送邮件(qq 邮件)
    Swagger 简单使用
    Nginx支持HTTPS,生成SSL证书
    使用 Python 搭建简易HTTP服务器
    扫码登陆原理
    【积累】在jQuery.Validate额中使用可以传入参数的message
    关于RUBY处理多语言转字符编码的一点经验 nkf
  • 原文地址:https://www.cnblogs.com/wupeixuan/p/8867010.html
Copyright © 2011-2022 走看看