您的位置:首页 > 其它

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

2013-10-16 15:46 483 查看
题目要求:

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

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐