二叉树转为有序列表

来源:互联网 发布:免费身份证扫描软件 编辑:程序博客网 时间:2024/05/16 07:47
#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 nothingreturn 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;}



0 0
原创粉丝点击