当前位置: 首页 > 后端技术 > Python

力扣简知offer面试题36.二叉搜索树和双向链表

时间:2023-03-26 01:48:42 Python

面试题36.二叉搜索树和双向链表解法第一步:需要将左指针指向比该元素小的前一个值,而右指针指向下一个大于当前元素的值。但是这个值不一定是节点的父节点或子节点。所以在递归的时候,需要把当前元素的已知限制传给儿子。而传递给左孩子的右边界是它自己,左边界是当前元素的父亲传递下来的边界。正确的孩子则相反。递归起始根节点的左右边界设置为None。第二步:如何通过连接最小值和最大值来求最小值和最大值。最小值和最大值不一定是叶子节点。我刚开始犯这个错误。最小值一定是某个节点的左儿子,他没有左儿子。是整棵树最左边的左儿子。所以我定义的寻找最小节点的条件是:没有左儿子+父亲的左极限是无最大节点:没有右儿子+父亲的右极限是无代码类解决方案:deftreeToDoublyList(self,root:'Node')->'Node':如果不是root:returnrootdefbuild(t,l,r):xl=tifnotlelselxr=tifnotrelserxxl,xxr=t,tif不是t.left:如果不是l:self.head=telse:t.left=lelse:ll,lr=build(t.left,l,t)t.left=lrxxl=ll如果不是t.right:如果不是r:self.rear=telse:t.right=relse:rl,rr=build(t.right,t,r)t.right=rlxxr=rrreturnxxl,xxrbuild(root,None,None)self.head.left=self.rearself.rear.right=self.headreturnself.head错误的写法这里错误的考虑了最大值和最小值现在出现在叶子节点反例:3/1\2class解决方案:deftreeToDoublyList(self,root:'Node')->'Node':如果不是root:returnrootself.head=rootself.rear=rootdefbuild(t,l,r):#print(t.val,t.left,t.right,l,r)如果不是t.left也不是t.right:如果不是l:self.head=telse:t.left=l如果不是r:self.rear=telse:t.right=rreturnt,txl=t如果不是lelselxr=t如果不是relserxxl,xxr=t,t如果不是t.left:t.left=lelse:ll,lr=build(t.left,l,t)t.left=lrxxl=ll如果不是t.right:t.right=relse:rl,rr=build(t.right,t,r)t.right=rlxxr=rrreturnxxl,xxrbuild(root,None,None)self.head.left=self.rearself.rear.right=self.head返回self.head