题目:
把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
题目来自: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; }