这道题思想非常简单,但是可能我代码写得有点复杂(因为我回溯用的不好),先着重看思路把,代码实现方法尽量讲一讲
分析:
- 我们先考虑最简单的情况,如果根结点就是目标节点,那么找离根结点距离为K的结点很容易,使用bfs找到第k层所有结点即可,现在定义getAns(root,K)来处理这种情况!
- 如下图,如果我们找到目标结点设为self.root,那么圆圈所圈部分中的结果,可直接用getAns(self.root,K)得到
- 那么圆圈外的部分,我们应该怎么得到呢?如果我们能想办法将圆圈外的部分也化为以目标节点为根节点的形式就直接解决了, 这次看一个复杂的情形,我们需要把圆圈内所有箭头(即目标节点至根结点路径中所有箭头)反转,才能构建出我们想要的形式,构建完之后使用getAns(self.root,K)计算结果。
思路:
着重讲下search()函数
- 当我们找到目标节点后,先计算一次结果,如分析中第2步。然后将其左右孩子全部抹去,将其本身父结点设为其孩子节点。
- 而为了尽量不改变父节点本身的结构,如左孩子为目标节点,则将父结点的left先指向None,方便之后再指向父节点的父节点,依次类推。
1 | # 别看代码挺长的,其实search()函数里面做的事是重复的,只是分了左右节点而已,思路还是比较明朗 |