一.题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
二.思路:
这个题目在牛客网上通过的代码中看的答案有点难以理解,自己按照自己的思路写了一个,比较容易理解。
很明显这是一个二分法或者说递归解决的问题。首先假设Root的左右节点都存在,考虑最理想的情况。这时候分别对左右子树进行处理。首先是左子树,调用本函数返回左子树双向链表的头结点left。这时候我们需要的操作是:
把left指向的链表的尾节点的right指向当前Root
把Root的left指向上面提到的尾节点
处理完左子树后处理右子树,同样调用当前函数返回右子树满足要求的双向链表的头结点right,需要的操作是:
把right的left指针指向当前Root
把当前Root的left指向right
最后是返回整个当前Root的处理结果
因为当前的Root是指向中间节点的,因此我们需要遍历到头结点输出
然后考虑边界问题:
当当前的Root为空时,直接返回Root
当Root不为空,但是它的左右子树都为空时,还是直接返回Root
当Root的左子树为空时,保持不变,就是让Root的left指针任然指向None
当Root的右子树为空时,也是保持不变就好了
最终的代码如下所示:
三.代码
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Convert(self, pRootOfTree):
# write code here
if not pRootOfTree:
return pRootOfTree
if not pRootOfTree.left and not pRootOfTree.right:
return pRootOfTree
if pRootOfTree.left:
left=self.Convert(pRootOfTree.left)
while left.right:
left=left.right
pRootOfTree.left=left
left.right=pRootOfTree
if pRootOfTree.right:
right=self.Convert(pRootOfTree.right)
pRootOfTree.right=right
right.left=pRootOfTree
while pRootOfTree.left:
pRootOfTree=pRootOfTree.left
return pRootOfTree