题目:
把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
题目来自:http://topic.csdn.net/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html
思路:
一看到这样的问题首先想到的是二叉树的遍历问题,具体是前序,中序,后序遍历主要是看问题如何描述,而这里刚好可以用中序遍历,在遍历的过程中不断的调整Left,Right指针,使之满足要求.
下面给出算法的实现:
- /*
- ---------------------------------------------
- 原作者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;
- }