美文网首页
二叉搜索树与双向链表

二叉搜索树与双向链表

作者: 愤怒的熊猫V | 来源:发表于2019-07-29 12:37 被阅读0次

根据二叉搜索树的性质,我们很容易想到用中序遍历的方法

一个比较蠢的方法是我们用中序遍历检索,然后将检索到的每个结点都存放在链表中

然后将这些结点全部双向连接起来

但是这样会产生O(N)的空间开销,没有必要,我们只关注链表的最后一个结点和当前结点

然后将最后一个结点和当前结点连接起来即可

中序遍历始终采用左-----根-----右的方式连接

比如我们定义一个函数,输入一个根节点,和当前情况下链表的最后一个结点,然后输出中序遍历之后的最后一个结点

例如我们定义 def    Find_Lastnode(self,pRoot,None):

宏观上来讲,我们输入了整棵树的根节点,并且将链表最后一个结点设置为None,那么就会输出整个列表的最后一个结点

然后我们顺着最后一个结点,不断的寻找它的左节点直到头结点,最后输出即可

具体过程可以如下表示

我们将根节点设置为当前结点

pCur = pRoot

如果左子树存在,那么就把左子树的根节点丢进去,这样会输出左子树产生的列表的最后一个结点

                #左

                if pRoot.left:

                        Lastnode = self.Find_Lastnode(pRoot.left,Lastnode)

                找到了左子树的最后一个结点之后,把它指向当前结点,即输入的这棵树的根节点

                Lastnode.right = pCur

                假设这个Lastnode不是一个空节点的话,我们还需要将pCur指向Lastnode

                pCur.left = Last

                #中

                然后将最后一个结点跟新为当前结点

                Lastnode = pCur

这样就完成了根结点与左子树的连接,且链表的最后一个结点现在是根节点

再对右子树进行遍历,这里很巧妙的一点是,由于我们永远采用左-------中-------右的顺序,

所以我们检索到右子树的第一个结点就是右子树中最小的结点,我们直接将它与链表最后一个结点,即根节点相连即可

当然,说到底,这也是中序遍历的本质,也不算特别巧妙,但是不熟练的话,就很难想通

                if pRoot.right:

                         Lastnode = self.Find_Lastnode(pRoot.,Lastnode)

最后返回的就是整个链表的最后一个结点啦

                return Lastnode

然后再对这个它不停地去寻找左结点,直到找到头结点就停止,然后输出的就是我们需要的链表头啦!

相关文章

网友评论

      本文标题:二叉搜索树与双向链表

      本文链接:https://www.haomeiwen.com/subject/yhxbrctx.html