您的位置:首页 > 其它

每天学一个算法(2)------二元查找树转变成排序的双向链表

2016-06-23 09:28 756 查看
题目:
把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

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



思路:

一看到这样的问题首先想到的是二叉树的遍历问题,具体是前序,中序,后序遍历主要是看问题如何描述,而这里刚好可以用中序遍历,在遍历的过程中不断的调整Left,Right指针,使之满足要求.


下面给出算法的实现:



[cpp] view
plain copy


/*

---------------------------------------------

原作者tree_star

2010年 10月18日下午 July

Modified by yuucyf 2011.04.21

---------------------------------------------

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

题目:

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

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

10

/ /

6 14

/ / / /

4 8 12 16

/ /

7 9

转换成双向链表

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

*/

#include "stdafx.h"

#include <assert.h>

#include <iostream>

using namespace std;

typedef struct tagTreeNode

{

int nValue;

tagTreeNode *psLeftNode;

tagTreeNode *psRightNode;

tagTreeNode()

{

nValue = 0;

psLeftNode = psRightNode = NULL;

}

}S_BSTreeNode;

typedef S_BSTreeNode S_DoubleListNode;

S_DoubleListNode * g_psListIndex = NULL;

//创建二叉查找树.

void AddBSTreeNode(S_BSTreeNode * &psCurNode, int nValue)

{

if (NULL == psCurNode)

{

S_BSTreeNode *psNode = new S_BSTreeNode;

assert(NULL != psNode);

psNode->nValue = nValue;

psNode->psLeftNode = NULL;

psNode->psRightNode = NULL;

psCurNode = psNode;

}

else

{

if (psCurNode->nValue > nValue)

{

AddBSTreeNode(psCurNode->psLeftNode, nValue);

}

else if (psCurNode->nValue < nValue)

{

AddBSTreeNode(psCurNode->psRightNode, nValue);

}

else

{

cout << "不允许插入重复值" << endl;

}

}

}

//把二叉查找树转换为Double List.

void ConvertBSTree2DoubleList(S_BSTreeNode *psCurNode)

{

if (NULL == psCurNode) return;

psCurNode->psLeftNode = g_psListIndex;

if (NULL != g_psListIndex)

g_psListIndex->psRightNode = psCurNode;

g_psListIndex = psCurNode;

cout << psCurNode->nValue << endl;

}

//以中序遍历二叉查找树.

void ErgodicBSTree(S_BSTreeNode *psCurNode)

{

if (NULL == psCurNode) return;

if (psCurNode->psLeftNode)

ErgodicBSTree(psCurNode->psLeftNode);

ConvertBSTree2DoubleList(psCurNode);

if (psCurNode->psRightNode)

ErgodicBSTree(psCurNode->psRightNode);

}

int _tmain(int argc, _TCHAR* argv[])

{

S_BSTreeNode *psRoot = NULL;

AddBSTreeNode(psRoot, 10);

AddBSTreeNode(psRoot, 4);

AddBSTreeNode(psRoot, 6);

AddBSTreeNode(psRoot, 8);

AddBSTreeNode(psRoot, 12);

AddBSTreeNode(psRoot, 14);

AddBSTreeNode(psRoot, 15);

AddBSTreeNode(psRoot, 16);

AddBSTreeNode(psRoot, 7);

AddBSTreeNode(psRoot, 9);

ErgodicBSTree(psRoot);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: