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


    题目描述

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

    思路:

    (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

    根据最高票讨论写出来的

  • 相关阅读:
    网络IO
    进程与线程
    计算机网络
    操作系统
    刷题笔记
    fasd
    线程池
    epoll反应堆
    read函数
    dup与dup2
  • 原文地址:https://www.cnblogs.com/ditingz/p/11746715.html
Copyright © 2020-2023  润新知