• 二元查找树转变成排序的双向链表之C#算法实现


    二元查找树转变成排序的双向链表之C#算法实现

    此题为July在CSDN发布的微软编程面试100题中的第一题,觉得蛮有趣的,今天也拿过来玩玩,July的代码用的是C++实现,可能因为有指针的原因吧,感觉看起来相对比较容易理解整个的实现过程,而我,试着用C#完成这样的功能。

    完整的题目如下:

    把二元查找树转变成排序的双向链表,要求不能创建任何新的结点,只调整指针的指向。

          10

        /  

      6    14

     /    /
    4 8  12 16

    转换成双链表  4=6=8=10=12=14=16

    动手编码之前,先回顾下二叉查找树的特点:任意节点的左子树都要小于当前节点,右子树都要大于当前节点。查询某个值,需要的时间复杂度为O(lgN)

    现在要求将其由树状结构改造成线性结构的双向链表,重点在于,获得当前节点左子树范围内最右节点(也是左子树最大值节点),以及右子树范围内最左节点(也是右子树最小值节点),然后,调整这两个节点当前节点左右顺序。即调整8、10之间和12、10之间的关系。

    算法思路:

    1. 树根节点,分左右子树。先将当前节点左子树范围内最右节点leftR找出来,再将右子树范围内最左节点rightL找出来(这两步放在一开始,因为此时左右子树内的关系还没改变,先取出来,时间消耗O(lgN)。只是查找到节点,空间上只用到一个索引,不会产生新的内存分配)。
    2. 若左子树为叶子节点,则直接设置其右向索引指向其父节点,左向递归结束;否则,将此节点作为根节点,递归调用第一步。
    3. 若右子树为叶子节点,则直接设置其左向索引指向其父节点,右向递归结束,否则,将此节点作为根节点,递归调用第一步。
    4. 设置根节点的左向节点为leftR,leftR的右向节点为根节点(其左向节点,在b和c两步的递归过程中已经赋值),设置根节点的右向节点为rightL,rightL的左向节点为根节点(其右向节点,在b和c两步的递归过程中已经赋值)

    C#源码部分:

    首先定义根节点和左右子树节点:

    以下代码为逻辑递归代码:

     
     
  • 相关阅读:
    fastadmin 后台登录 模块不存在
    camunda_13_postgresql
    java stream(jrebel.com)
    drools_01_documents
    camunda_12_forms
    camunda_10_script_task_access_variable
    drools_04_global
    drools_08_event_listener
    drools_02_installation
    camunda_04_quickstart
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3629394.html
Copyright © 2020-2023  润新知