1.二叉搜索树中第k小的元素

1.核心思路:中序
2.中序出来的就是123456
3.所以每次左子树遍历之后,k-1 当k==0的时候,正好就是顺序的第k个
4.终止条件是遍历到 None或者k==0也就是提前找到了第k个,就直接结束,不用再找了
❌ 情况 1:不加 k==0 这个终止条件,代码会怎么样?
如果终止条件只写 if node is None: return,代码逻辑上能得到正确答案,但会做大量「无用功」:
-
哪怕找到了目标节点(
k=0),递归依然会继续执行:遍历完当前节点的右子树、遍历完父节点的右子树、遍历完整棵树的所有剩余节点; -
比如找第 2 小的节点,找到后还要遍历后面所有节点,时间复杂度从最优的
O(H+k)变成了最差的O(N)(N 是总节点数),效率暴跌!class Solution:
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
ans = 0
def dfs(node):
nonlocal ans,k
if node is None or k==0:
return
dfs(node.left)
k-=1
if k==0:
ans = node.val
dfs(node.right)
dfs(root)
return ans
2.二叉树展开为链表

- 展开后的单链表应该同样使用
TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。
因为要求展开后的单链表应该与二叉树 先序遍历 顺序相同
那使用头插法就得用后序遍历
定义一个全局变量头head,根据要求,后序的root的right指向head,head再指向root,就完成了头插法,不好理解的话,画个图一下就明白了