#include <iostream>
struct BinaryBode
{
int val;
BinaryBode *left;
BinaryBode *right;
BinaryBode(int v=0,BinaryBode *lt=nullptr,BinaryBode *rt=nullptr)
:val(v),left(lt),right(rt)
{ }
};
//创建时传递的一定是指针引用,因为若传入的是指针,则原来的空指针还是会指向空指针
int insert(BinaryBode *&phead,int val)
{
if(phead==nullptr)
phead=new BinaryBode(val,nullptr,nullptr);
else if(val<phead->val)
insert(phead->left,val);
else if(val>phead->val)
insert(phead->right,val);
else
;//Duplicate;do nothing
return 0;
}
int printTree(BinaryBode *phead)
{
if(phead!=nullptr)
{
std::cout<<phead->val<<" ";
printTree(phead->left);
printTree(phead->right);
}
return 0;
}
BinaryBode* findMinNode(BinaryBode *phead)
{
if(phead==nullptr)
return nullptr;
while(phead->left!=nullptr)
phead=phead->left;
return phead;
}
int convertNode(BinaryBode *phead,BinaryBode *&last_node)
{
if(phead==nullptr)
return 0;
//对左子树进行转换,last_node是转换后链表最后一个结点的指针
if(phead->left!=nullptr)
convertNode(phead->left,last_node);
//将树结点的左指针指向左子树的最后一个结点
phead->left=last_node;
//将左子树的最后一个结点的右指针指向树结点
if(last_node!=nullptr)
last_node->right=phead;
//更新最后一个结点为树结点
last_node=phead;
//对右子树进行转换,last_node是链表最优一个结点指针
if(phead->right!=nullptr)
convertNode(phead->right,last_node);
return 0;
}
BinaryBode* bsTreeToList(BinaryBode *phead)
{
if(phead==nullptr)
return nullptr;
BinaryBode *head=findMinNode(phead);
BinaryBode *last_node=nullptr;
convertNode(phead,last_node);
return head;
}
int printList(BinaryBode *phead)
{
while(phead!=nullptr)
{
std::cout<<phead->val<<" ";
phead=phead->right;
}
std::cout<<std::endl;
return 0;
}
<pre name="code" class="cpp">#include <iostream>
#include "bsTree2orderList.h"
int main()
{
BinaryBode *head=nullptr;
insert(head,10);
insert(head,6);
insert(head,14);
insert(head,4);
insert(head,8);
insert(head,12);
insert(head,16);
printTree(head);
std::cout<<std::endl;
BinaryBode *lhead=bsTreeToList(head);
printList(lhead);
return 0;
}