二叉搜索树和双向链表

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

二叉树可以转换为双向链表,对于一个节点来说右左右两个指针,对于右n个节点的二叉树来说一共有2n个指针,对于n个节点的双向链表存在的指针的数量是中间的2(n-1)加上头尾指针也是2*n个,所以一定可以通过某种方式将二叉树转化为双向链表。转换为双向链表的可以增加访问速度,二叉树的前中后遍历一般采用递归的方式进行,如果树比较庞大尤其是深度比较大的时候耗费的空间比较多。如果每次访问都按照递归方式调用是非常不合理的,简单的排序二叉树 {2,1,3},其中1,3分别是2的左右节点,这个二叉树的中序遍历是 1,2,3。如果将节点1的right指针指向后继节点2,2的right指针指向后继节点3,三个节点的left指针指向前驱节点就可以转换成双向链表了,以后中序遍历的时候就可以直接访问这个双向链表就可以了,所以在原来树的结构上再增加两个方向指针,代替上面的两个指针指向的前驱和后继,许多书上将类似的操作成为 二叉树的线索化

二叉搜索树的特点是左边小于中间小于右边,得到排序的双向链表就是将中序遍历线索化,一个非常简单的实现方式就是将中序遍历中的节点依次放在全局数组中,然后遍历数组,然后将数组的相邻元素用right指针连接后面的,用left指针连接前面的就能达到目的,代码如下。

$nodes = array();
function Convert($pRootOfTree)
{
    // write code here
    GLOBAL $nodes;
    $nodes = array();
    inorder($pRootOfTree);
    for($i = 0;$i<count($nodes)-1;$i++){
        $nodes[$i]->right = $nodes[$i+1];
        $nodes[$i+1]->left = $nodes[$i];
    }
    return $nodes[0];
}
function inorder($Root){
    GLOBAL $nodes;
    if($Root==null){
        return;
    }else{
        inorder($Root->left);
        $nodes[] = $Root;
        inorder($Root->right);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,509评论 1 31
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,225评论 0 12
  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 1,603评论 0 7
  • 二叉树的定义#### 二叉树是n(n>=0)个具有相同类型的元素的有限集合,当n=0时称为空二叉树,当n>0时,数...
    kylinxiang阅读 1,457评论 0 2
  • 原链接:理解线索二叉树|CloudWong 线索二叉树原理 遍历二叉树的其实就是以一定规则将二叉树中的结点排列成一...
    简Cloud阅读 8,449评论 1 16