面试题27二叉搜索树与双向链表 思路:中序遍历一颗二叉搜索树的时候能够得到一个从小到大排序的有序序列。中序遍历二叉搜索树将其转换为双向链表。

其中left指针域作为双向链表的前驱指针,right指针域作为双向链表的后继指针
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
//面试题27二叉搜索树与双向链表 思路:中序遍历一颗二叉搜索树的时候能够得到一个从小到大排序的有序序列。中序遍历二叉搜索树将其转换为双向链表。
//其中left指针域作为双向链表的前驱指针,right指针域作为双向链表的后继指针
typedef struct BinaryTreeNode
{
int data;
BinaryTreeNode *left,*right;
}BinaryTreeNode;
void ConvertBinaryTreeNodeToList(BinaryTreeNode*pRoot,BinaryTreeNode**pLastNodeInList);//此函数将二叉搜索树转换为一个双向链表并通过pLastNodeInList返回双向链表的最后一个结点
BinaryTreeNode*Convert(BinaryTreeNode*pRoot)
{
if(pRoot==NULL)
{
return NULL;
}
BinaryTreeNode* pLastNodeInList=NULL;//pLastNodeInList 指向双向链表的尾结点同过他的前驱结点向前遍历可以找到双向链表的头指针
ConvertBinaryTreeNodeToList(pRoot,&pLastNodeInList);
BinaryTreeNode *pHeadOfList=pLastNodeInList;//pLastNodeInList 指向双向链表的尾结点同过他的前驱结点向前遍历可以找到双向链表的头指针
while(pHeadOfList!=NULL&&pHeadOfList->left!=NULL)
{
pHeadOfList=pHeadOfList->left;
}
return pHeadOfList;
}
//此函数将二叉搜索树转换为一个双向链表并通过pLastNodeInList返回双向链表的最后一个结点
void ConvertBinaryTreeNodeToList(BinaryTreeNode*pRoot,BinaryTreeNode**pLastNodeInList)//此函数将二叉搜索树转换为一个双向链表并通过pLastNodeInList返回双向链表的最后一个结点
{
if(pRoot==NULL)
{
return;
}
BinaryTreeNode*pCurrent=pRoot;
if(pCurrent->left!=NULL)
{
ConvertBinaryTreeNodeToList(pCurrent->left,pLastNodeInList);
}
pCurrent->left=*pLastNodeInList;
if((*pLastNodeInList)!=NULL)
{
(*pLastNodeInList)->right=pCurrent;
}
*pLastNodeInList=pCurrent;
if(pCurrent->right!=NULL)
{
ConvertBinaryTreeNodeToList(pCurrent->right,pLastNodeInList);
}
}
void CreateBinaryTree(BinaryTreeNode**pRoot)//从控制台中读入字符串 字符之间用逗号隔开
{
int ch;
scanf("%d,",&ch);
if(ch==0)//最后遇到‘0’ 递归自然会结束好好想想就清楚了。
{
*pRoot=NULL;
}
else
{
*pRoot=new BinaryTreeNode;//先建立根节点
(*pRoot)->data=ch;
CreateBinaryTree(&((*pRoot)->left));//建立左子树
CreateBinaryTree(&((*pRoot)->right));//建立右子树
}
}
void PrintList(BinaryTreeNode* pHead)
{
if(pHead==NULL)
{
return;
}
while(pHead!=NULL)
{
printf("%d ",pHead->data);
pHead=pHead->right;
}
printf("\n");
}
int main()
{
/*
10
6 14
4 8 12 16
*/
BinaryTreeNode*pRoot=NULL;
cout<<"输入二叉树的先序序列建立二叉树如输入 10,6,4,0,0,8,0,0,14,12,0,0,16,0,0"<<endl;
CreateBinaryTree(&pRoot);// 建立二叉树时的先序序列: 10,6,4,0,0,8,0,0,14,12,0,0,16,0,0
BinaryTreeNode * pHead=Convert(pRoot);
cout<<"双向链表的值为:"<<endl;
PrintList(pHead);
return 0;
}