算法题解-二叉搜索树中第K小的元素

114 阅读2分钟

题目

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

题解

第一种

我们首先在函数中先声明了一个空数组rootArr,我们这个数组用于存储树中所有节点的值,然后我们声明了一个递归函数fn,这个函数的作用是将树中所有节点的值存储到rootArr中,函数fn接受一个参数root,root参数表示当前处理的节点,fn函数首先将当前节点的值root.val存储到rootArr中,然后分别递归处理当前节点的左子树和右子树,直到遍历完整棵树,接下来我们对rootArr进行排序,方便我们以后继续查找第k小元素,由于rootArr中元素已经按照从小到大的顺序排好序了,所以我们直接将rootArr[k-1]返回即可

var kthSmallest = function (root, k) {
    const rootArr = [];
    fn(root);
    rootArr.sort((a, b) => a - b);
    return rootArr[k - 1];
    function fn(root) {
        if (!root) {
            return
        }
        rootArr.push(root.val);
        if (root.left) {
            fn(root.left);
        }
        if (root.right) {
            fn(root.right);
        }
    }
};

第二种

我们在函数中先声明了一个空数组res,用于存储树中所有节点的值,然后我们声明了三个变量,p和index以及n,变量p用于表示当前处理的节点,它的初始值为root,变量index用于表示当前处理的节点是第几个节点,它的初始值为0,变量n用于表示从res中取出的节点,然后我们使用while循环遍历整棵树,循环条件为res数组不为空或者p不为空,在循环中,我们首先使用while循环将p的所有左子树节点都压入res数组中,然后从res数组中弹出一个节点n,并将index加1,如果index等于k,则说明当前节点就是第k小的节点,直接返回n的值,如果当前节点存在右子树,则将p指向右子树的根节点,以便继续遍历右子树,如果当前节点不存在右子树,则p的值会在下一个循环中从res数组中取出即可

var kthSmallest = function(root, k) {
    let res=[]
    let p=root
    let index=0
    while(res.length||p){
        while(p){
            res.push(p)
            p=p.left
        }
        let n=res.pop()
        index++
        if(index===k){
            return n.val
        }
        if(n.right) p=n.right
    }
};

坚持努力,无惧未来!