面试题27二叉搜索树与双向链表

面试题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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值