记录已通过的力扣题解法,随便写写,给自己看的。

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或者Linked List都行,要存储了就调用add,
就没啥毛病。

看来全局变量的tip对二叉树很重要啊!!!

posted @ 2021-09-28 23:35  矢宿星辰  阅读(74)  评论(0)    收藏  举报