zoukankan      html  css  js  c++  java
  • JZ26 二叉搜索树与双向链表

    二叉搜索树与双向链表


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

    思路:

    二叉搜索树的中序遍历为 递增序列 。
    将 二叉搜索树 转换成一个 “排序的循环双向链表” ,其中包含三个要素:

    • 排序链表: 节点应从小到大排序,因此应使用 中序遍历 “从小到大”访问树的节点。
    • 双向链表: 在构建相邻节点的引用关系时,设前驱节点 pre 和当前节点 cur ,不仅应构建 pre.right = cur ,也应构建 cur.left = pre 。
    • 循环链表: 设链表头节点 head 和尾节点 tail ,则应构建 head.left = tail 和 tail.right = head 。
    func Convert( pRootOfTree *TreeNode ) *TreeNode {
        if pRootOfTree == nil {
            return nil
        }
        var stack []*TreeNode
        var pre *TreeNode = nil
        var root *TreeNode = pre
        isFirst := true
        for len(stack) != 0 || pRootOfTree != nil {
            for pRootOfTree != nil {
                stack = append(stack, pRootOfTree)
                pRootOfTree = pRootOfTree.Left
            }
            sz := len(stack)
            if sz != 0 {
                pRootOfTree = stack[sz-1]
                stack = stack[:sz-1]
                if isFirst {
                    isFirst = false
                    pre = pRootOfTree
                    root = pre
                } else {
                    pre.Right = pRootOfTree
                    pRootOfTree.Left = pre
                    pre = pRootOfTree
                }
                pRootOfTree = pRootOfTree.Right
            }
        }
        return root
    }
  • 相关阅读:
    ubutun Sogou输入法安装
    git的使用
    比较字符串(包含以及变位词)
    python 与时间有关的操作
    PyBrain库的example之NFQ流程图分析
    python之面向对象(继承)
    C/C++中一些不太注意到的小知识点--[锦集]
    python 有关引用的一些问题
    CMake尝鲜
    vim初探
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14639139.html
Copyright © 2011-2022 走看看