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

题目要求:

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

要求不能创建任何新的结点,只调整指针的指向。

         10

        / \

      6 14

     / \ / \

  4 8 12 16

转换成双向链表

4=6=8=10=12=14=16。

分析:

二元查找树:它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二元查找树

在逻辑上可以通过中序遍历二元查找树,对每一个根节点进行如下操作(假设当前双向链表的尾节点是index, 头节点是head):

  (1)把根节点的左孩子指向index。

  (2)把index的右孩子指向根节点。 这里要判断index是否已存在,如果不存在则这个根节点就是双向链表的头节点。 

这两步可以建立尾节点index与根节点的双向连接。

  (3)把index修改为最后一个节点。

 

代码实现如下,用C++语言,已编译通过并运行成功。 

#include <stdio.h>
#include <iostream>
#include <string>

struct TreeNode
{
    int value;
    TreeNode* leftNode;
    TreeNode* rightNode;
};

typedef TreeNode DoubleList;

DoubleList* head;
DoubleList* index;

void AddNodeToTree(TreeNode* &treeHead, int value);

void OrderTree(TreeNode* treeHead);

void ConvertToDoubleList(TreeNode* currentNode);

void OutputDoubleList();

void AddNodeToTree(TreeNode* &treeHead, int value)
{
    if(treeHead == NULL)
    {
        TreeNode* node = new TreeNode();
        node->value = value;
        node->leftNode = NULL;
        node->rightNode = NULL;
        treeHead = node;
    }
    else
    {
        if(value >= treeHead->value)
        {
            AddNodeToTree(treeHead->leftNode,value);
        }
        else
        {
            AddNodeToTree(treeHead->rightNode,value);
        }
    }
}

void OrderTree(TreeNode* treeHead)
{
    if(treeHead == NULL)
    {
        return;
    }
    if(treeHead->leftNode != NULL)
    {
        OrderTree(treeHead->leftNode);
    }
    ConvertToDoubleList(treeHead);
    cout<<treeHead->value<<" ";
    if(treeHead->rightNode != NULL)
    {
        OrderTree(treeHead->rightNode);
    }
}

void ConvertToDoubleList(TreeNode* currentNode)
{
    currentNode->leftNode = index;
    if(index != NULL)
    {
        index->rightNode = currentNode;
    }
    else
    {
        head = currentNode;
    }
    index=currentNode;
}

void OutputDoubleList()
{
    DoubleList *temp = head;
    while(temp != NULL)
    {
        cout<<temp->value<<" ";
        temp=temp->rightNode;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    TreeNode* BSTree = NULL;

    AddNodeToTree(BSTree, 10);
    AddNodeToTree(BSTree, 1);
    AddNodeToTree(BSTree, 7);
    AddNodeToTree(BSTree, 6);
    AddNodeToTree(BSTree, 8);
    AddNodeToTree(BSTree, 4);
    AddNodeToTree(BSTree, 5);
    AddNodeToTree(BSTree, 2);

    OrderTree(BSTree);

    OutputDoubleList();

    return 0;
}
View Code

 

                                                                                2013/10/16 于OF W4

 

posted on 2013-10-16 15:46  Jason-Tang  阅读(209)  评论(0)    收藏  举报

导航