记录已通过的力扣题解法,随便写写,给自己看的。
230二叉搜索树中第K小的元素
要解这道题,首先要清楚一个概念:二叉搜索树的中序遍历结果,就是从小到大排列的,换句话说,这题该用中序遍历,遍历到第K个元素。
细节:按照二叉树的一般解法,重新定义遍历函数traverse,方法参数包括,K,root。
但是!!!
对于traverse方法,需要什么样的返回值类型呢?
按照一般思路,返回int类型,再让调用方法接收个返回值,再返回。
似乎没什么问题?
但是,有没有想过....
traverse函数是我们用来递归的啊!!!
你下一层返回一个int值给上一层递归是什么意思?有什么意义?人上一层递归根本不需要,这个int值明明只有原调用方法需要啊,浪费空间不说,还会导致额外困扰。
直接void就好。
我们可以定义一个全局变量res,traverse来改变这个值,原调用方法来返回这个值。
现在就剩下最后一个问题,如何确定我们所需要的值,第K个数?
唉,受上面启发,只好再定义一个全局计数器了,中序遍历不是说在中间访问元素吗?我们加个判断,如果访问到K,那就直接返回。
当然,你的Base case 还是得加的,递归直到null。
class Solution {
public int kthSmallest(TreeNode root, int k) {
traverse(root,k);
return res;
}
int res = 0;
int count =0;
void traverse(TreeNode root ,int k){
if(root == null)
return;
traverse(root.left,k);
count++;
if(k == count)
{res = root.val;
return;
}
traverse(root.right,k);
}
}
好烦,记忆力太差,解题思路当时清楚的很,没想到过个十天半月就又写不出来了,看来真有写博客整理记录的必要。
144、145二叉树的前序和后序遍历
这两道题比较基础,学二叉树的时候老师就讲过了,然而那个时候觉得很简单,没有多想,做题时还真被卡了一下。
被卡的地方就是输出,我不知道该怎么输出,想着定义一个集合放在方法中,立刻就知道不可行,空间消耗太大,还会
不断地重复存储元素。
好吧...我得承认,思维不够全面。
至于解决方法,很简单,还是全局变量,
在方法外面定义一个Array List
就没啥毛病。
看来全局变量的tip对二叉树很重要啊!!!
浙公网安备 33010602011771号