zoukankan      html  css  js  c++  java
  • 把二元查找树转变成排序的双向链表

    把二元查找树转变成排序的双向链表

    用的比较笨的办法,思路是按中序递归得到顺序然后依次修改其指针域。希望得到更好的算法,望知道的赐教

    代码
    //二叉排序树变为双向链表
    #include<iostream>
    #include
    <stack>
    using namespace std;
    struct treenode{ //树节点定义
    int data;
    treenode
    *l;
    treenode
    *r;
    };
    void create(treenode *&t){ //建树
    t->data=10;
    t
    ->l=new treenode();
    t
    ->l->data=6;
    t
    ->l->l=new treenode();
    t
    ->l->l->data=4;
    t
    ->l->l->l=NULL;
    t
    ->l->l->r=NULL;
    t
    ->l->r=new treenode();
    t
    ->l->r->data=8;
    t
    ->l->r->l=NULL;
    t
    ->l->r->r=NULL;

    t
    ->r=new treenode();
    t
    ->r->data=14;
    t
    ->r->l=new treenode();
    t
    ->r->l->data=12;
    t
    ->r->l->l=NULL;
    t
    ->r->l->r=NULL;
    t
    ->r->r=new treenode();
    t
    ->r->r->data=16;
    t
    ->r->r->l=NULL;
    t
    ->r->r->r=NULL;

    }
    void printtree(treenode *t){ //测试
    if(t){
    printtree(t
    ->l);
    cout
    <<t->data<<" ";
    printtree(t
    ->r);
    }
    }
    void convert(treenode *&t){ //转换,主要思路为利用堆栈存储节点顺序然后逆序输出
    stack<treenode *> s,save;
    treenode
    *p=t;
    while(p||!s.empty()){
    if(p){s.push(p);p=p->l;}
    else{
    p
    =s.top();
    s.pop();
    save.push(p);
    p
    =p->r;
    }
    }
    treenode
    *pre,*next;
    next
    =save.top();
    save.pop();
    next
    ->r=NULL;
    while(!save.empty()){
    pre
    =save.top();
    save.pop();
    pre
    ->r=next;
    next
    ->l=pre;
    next
    =pre;
    }
    next
    ->l=NULL;
    t
    =next;

    }
    int main(void){
    treenode
    *t=new treenode();
    treenode
    *pre=NULL;
    create(t);
    printtree(t);
    cout
    <<endl;
    convert(t);
    cout
    <<endl;
    while(t){
    cout
    <<t->data<<" ";
    t
    =t->r;
    }
    system(
    "pause");
    return 0;
    }
  • 相关阅读:
    NYOJ41三个数从小到大排序
    HDUOJ2115I Love This Game
    NYOJ56阶乘因式分解(一)
    NYOJ65另一种阶乘问题
    HDUOJ1234开门人和关门人
    NYOJ74小学生算术
    NYOJ11奇偶数分离
    HDUOJ3980取模运算
    HDUOJ2014 青年歌手大奖赛_评委会打分
    HDUOJ1860 统计字符
  • 原文地址:https://www.cnblogs.com/aLittleBitCool/p/1935957.html
Copyright © 2011-2022 走看看