/*
题目:
输入一棵二叉排序树,将其转换成一个双向链表。要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
*/
#include <iostream>
#include <cassert>
using namespace std;
typedef int ElemType;
typedef struct BinaryTreeNode
{
ElemType data;
struct BinaryTreeNode *lchild, *rchild;
}BinaryTreeNode,*BinaryTree;
typedef BinaryTreeNode DoubleLinkList;
DoubleLinkList *pHead;
DoubleLinkList *pListIndex;
void CreatBinaryTree(BinaryTree *T,int value)
{
if (!(*T))
{
BinaryTreeNode *node = new BinaryTreeNode;
assert(node);
node->data = value;
node->lchild = NULL;
node->rchild = NULL;
*T = node;
}
else if ((*T)->data > value)
{
CreatBinaryTree(&(*T)->lchild,value);
}
else if ((*T)->data < value)
{
CreatBinaryTree(&(*T)->rchild,value);
}
}
void ConvertToDList(BinaryTreeNode *pCurrent)
{
pCurrent->lchild = pListIndex;
if (NULL != pListIndex)
{
pListIndex ->rchild = pCurrent;
}
else
{
pHead = pCurrent;
}
pListIndex = pCurrent;
cout << pCurrent->data << endl;
}
void InOrderTraverseTree(BinaryTree T)
{
if (NULL == T)
{
return ;
}
InOrderTraverseTree(T->lchild);
ConvertToDList(T);
InOrderTraverseTree(T->rchild);
}
int main()
{
BinaryTree T = NULL;
pListIndex = NULL;
pHead = NULL;
CreatBinaryTree(&T,10);
CreatBinaryTree(&T,4);
CreatBinaryTree(&T,6);
CreatBinaryTree(&T,8);
CreatBinaryTree(&T,12);
CreatBinaryTree(&T,14);
CreatBinaryTree(&T,15);
CreatBinaryTree(&T,16);
InOrderTraverseTree(T);
BinaryTreeNode *pCurrent = pHead;
BinaryTreeNode *pPrev = NULL;
while(pCurrent != NULL)
{
cout << pCurrent->data ;
pPrev = pCurrent;
pCurrent=pCurrent->rchild;
if (pCurrent != NULL)
{
cout << " -> ";
}
}
cout << endl;
while(pPrev != NULL)
{
cout << pPrev->data ;
pPrev=pPrev->lchild;
if (pPrev != NULL)
{
cout << " -> ";
}
}
cout << endl;
return 0;
}
//层次遍历
void LevTraverseTree(BinaryTree T)
{
if (NULL == T)
{
return ;
}
deque<BinaryTreeNode *> queue ;
BinaryTreeNode *p;
queue.push_back(T);
while (!queue.empty())
{
p = queue.front();
cout << p->data<< " $$";
queue.pop_front();
if (p->lchild != NULL)
{
queue.push_back(p->lchild);
}
if (p->rchild != NULL)
{
queue.push_back(p->rchild);
}
}
}
本文介绍了一种将二叉排序树转换为双向链表的方法,通过中序遍历调整树节点间的指针连接,实现转换过程不创建新节点。文章提供了完整的C++实现代码,展示了如何构造二叉树并进行转换。
1039

被折叠的 条评论
为什么被折叠?



