牛客网-二叉搜索树与双向链表-栈和递归

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

思路:

(1)二叉树的中序遍历,将中序遍历前一节点的右指针指向当前节点,当前节点的左指针指向前一节点。

(2)考虑数的中序遍历可以用栈或者递归。

1.栈

(1)把当前节点的左子树压栈,最后一个左叶节点设为双向链表的开始节点。

(2)弹出节点,并设前一节点右指针和当前节点左指针,当前弹出的节点有右子树的话,就继续将左子树都压栈。

2.递归

(1)先将左子树转为双向链表

(2)移动左子树构成链表的指针到达最后一个节点

(3)若左子树链表不为空,将根节点加在最后一个节点后

(4)将右子树转为双向链表

(5)右子树不为空加在根节点后

(6)根据左子树链表是否为空确定返回节点

代码:

1.栈实现中序遍历

class Solution:
    def Convert(self, pRootOfTree):
        # write code here
        stack = []
        p = pRootOfTree
        pre = None
        root =None
        while(p!=None or len(stack)!=0):
            while(p):
                stack.append(p)
                p = p.left
            p = stack.pop()
            if pre==None:
                root = p
                pre = p
            else:
                pre.right = p
                p.left = pre
                pre = p
            p = p.right
        return root

2.递归

class Solution:
    def Convert(self, pRootOfTree):
        # write code here
        if pRootOfTree==None:
            return None
        if pRootOfTree.right==None and pRootOfTree.left==None:
            return pRootOfTree
        left = self.Convert(pRootOfTree.left)
        p = left
        while(p!=None and p.right!=None):
            p=p.right
        if left!=None:
            p.right = pRootOfTree
            pRootOfTree.left = p
        right = self.Convert(pRootOfTree.right)
        if right != None:
            pRootOfTree.right = right
            right.left = pRootOfTree
        return left if left!=None else pRootOfTree

 题目链接:

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

根据最高票讨论写出来的

原文地址:https://www.cnblogs.com/ditingz/p/11746715.html