把二元查找树转变成排序的双向链表

原创 2012年03月26日 16:16:20

题目:

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

 

分析:

解法1:最简单的就是归并思想的运用,对于结点P,将P的左子树、右子树分别转化为排序的双向链表,然后与结点P链接起来。

void bst2DLL(BSTPtrhead, DLLPtr &lef, DLLPtr &rig) {
    lef = rig = NULL;
 
    if (head == NULL) return;
 
    // lef1, lef2 为左子树转化为双向链表后的头尾结点
    DLLPtr lef1, lef2;
 
    // rig1, rig2 为右子树转化为双向链表后的头尾结点
    DLLPtr rig1, rig2;
 
    bst2DLL(head->lef, lef1, lef2);
    bst2DLL(head->rig, rig1, rig2);
 
    head->lef = head->rig = NULL;
 
    // 处理左子树部分
    if (lef2 != NULL) {
        lef2->rig = head;
        head->lef = lef2;
    }
 
    // 处理右子树部分
    if (rig1 != NULL) {
        rig1->lef = head;
        head->rig = rig1;
    }
 
    lef = (lef1 != NULL) ? lef1 : head;
    rig = (rig2 != NULL) ? rig2 : head;
}

解法2:考虑到中序遍历查找树的特点[有序输出],可以考虑替换中序遍历输出部分为链接当前结点与它的前一个结点last,关键点在于last这个结点如何得到。

voidbst2DLL_inorder(BSTPtr head, BSTPtr &last)
{
    if (head == NULL) return;
 
    bst2DLL_inorder(head->lef, last);
 
    // 中序遍历的处理部分
    head->lef = last;
    if (last != NULL) last->rig =head;
    last = head;
 
    bst2DLL_inorder(head->rig, last);
}

解法3:解法二的非递归方式,其基本思想就是用一个栈stack来模拟递归过程,不详述

算法题22 把二元查找树转变成排序的双向链表(中序遍历)

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。  10  / / 6 14 / / / /4 8 12 16 转换成双向链表4=6=8=...
  • wcyoot
  • wcyoot
  • 2011年05月18日 00:11
  • 4657

把二元查找树转变成排序的双向链表——Java实现

题目:  输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 ...
  • yx0628
  • yx0628
  • 2014年04月24日 10:50
  • 2041

解题笔记(4)——把二元查找树转变成排序的双向链表

问题描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。    10   / /   6  14  / / / / 4  8 12 ...
  • wuzhekai1985
  • wuzhekai1985
  • 2011年07月15日 20:50
  • 3517

1. 微软面试题:把二元查找树转变成排序的双向链表(树)

微软面试题集100题之1:把二元查找树转变成排序的双向链表(树)
  • hhh3h
  • hhh3h
  • 2014年03月04日 20:43
  • 878

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。        10   / /  6 14  / / / / 4 8...
  • u013718171
  • u013718171
  • 2016年04月12日 16:47
  • 168

面试题1-将二叉搜索树转变成排序的双向链表

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。        对于一棵二叉搜索树                             ...
  • l_tudou
  • l_tudou
  • 2016年06月24日 20:50
  • 1211

【算法题】二元查找树转换成排序的双向链表

网上看到的笔试题一道: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整指针的指向,如:                      10   ...
  • lewsn2008
  • lewsn2008
  • 2013年04月17日 13:39
  • 1650

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

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 比如将二元查找树                    ...
  • qq_23217629
  • qq_23217629
  • 2016年06月24日 11:14
  • 1790

把二元查找树转变成排序的双向链表…

题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。   分析:1、利用二元查找树的特点:左子树上的最大的数是整个左子树最右边的数(这个...
  • life_liver
  • life_liver
  • 2013年01月29日 21:18
  • 136

.把二元查找树转变成排序的双向链表

参考地址为 //* Copyright(C) 2011 //* //* FUNCTION : TreeToLink //* DESCRIPTION : Tree to link //*...
  • perfect2011
  • perfect2011
  • 2011年11月30日 14:05
  • 848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:把二元查找树转变成排序的双向链表
举报原因:
原因补充:

(最多只允许输入30个字)