题目
给定一个二叉搜索树的根节点 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 } };