230. 二叉搜索树中第K小的元素 | 刷题打卡

174 阅读2分钟

前言

大二下学期学的二叉树有些忘记了,这几天把二叉树熟悉一下。

题目描述

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

示例 1:

输入:root = [3,1,4,null,2], k = 1 
输出:1 

示例 2:

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3 

解题思路

1. 发现规律

           这种二叉树以中序遍历   是升序数组,

           第k小的元素就很好找了。

2. 中序遍历概念

中序遍历的原则是:

若被遍历的二叉树非空,则按如下顺序进行遍历。

              ①以中序遍历方式遍历根结点的左子树**。
**              ②访问根结点。
③以中序遍历方式遍历根结点的右子树**。
显然,中序遍历过程也是一个递归过程,其递归算法如下。
void INORDER( BTREE T)   /* T为二叉树根结点所在链结点的地址*/
if(T! = NULL){
INORDER(T- > Ichild) ;       /*遍历T所指结点的左子树*/1.5
VISIT(T);                              /*访问T所指结点*/
INORDER(T- > rchild) ;      /*遍历T所指结点的右子树*/
**

AC代码1

var kthSmallest = function(root, k) {    
    let num = [];    
    var getNum = function(root) {      
        if(root != null){          
            getNum(root.left);          
            num.push(root.val);          
            getNum(root.right);      
        }        
    }    
    getNum(root);    
    return num[k-1];
};

AC代码【优化】

var kthSmallest = function(root, k) {    
    let num = [];    
    var getNum = function(root) {      
        if(root != null){          
            getNum(root.left);          
            num.push(root.val);          
            getNum(root.right);      
        }    
    }    
    getNum(root);    
    return num[k-1];
};

总结

其中二叉树的遍历有三种:

    1. 前序遍历            2. 中序遍历           3. 后序遍历

void INORDER( BTREE T) /* T为二叉树根结点所在链结点的地址*/
if(T! = NULL){
INORDER(T- > Ichild) ; /*遍历T所指结点的左子树*/1.5
VISIT(T); /*访问T所指结点*/
INORDER(T- > rchild) ; /*遍历T所指结点的右子树*/

只是 VISIT(T); 放置的位置为 前 中 后

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情