数据结构也不是那么没意思之后序二叉树+二叉树转伪双向循环链表

来源:互联网 发布:access数据库能仓库 编辑:程序博客网 时间:2024/04/30 12:36
全部代码
#include <iostream>using namespace std;  class Tree  {  public:  Tree();  Tree* malloc_node();  int free_node(Tree*&);  int create(Tree*&);  int rearorder(Tree*);  int rear_club(Tree*);  int insert_head(Tree*);Tree* parent(Tree*);int print_club();  private:  int number;  Tree *lchild, *rchild;  int ltag, rtag;  };Tree *pre = NULL; //记录线索化二叉树的时候刚刚访问过的节点    Tree *head = NULL; //线索化后做链表头指针  里面记录节点总数 根据遍历顺序不同head的左右孩子也不同    int main()  {  Tree *root = NULL;  root->create(root);  root->rearorder(root);  root->insert_head(root);  root->print_club();  return 0;  }  Tree::Tree() : number(-9999), lchild(NULL), rchild(NULL), ltag(0), rtag(0)    {    ;    }   Tree* Tree::malloc_node()    {    return new Tree;    }    int Tree::free_node(Tree *&node)    {    delete node;    node = NULL;    return 0;    }    int Tree::create(Tree *&node)    {    int number = 0;    cout << "请输入节点数据:" << endl;    cin >> number;    if (number == -1)    {    cout << "返回上层成功" << endl;    return 0;    }    node = malloc_node();    node->number = number;    cout << "目前位置为" << number << "的左子树,";    create(node->lchild);    cout << "目前位置为" << number << "的右子树,";    create(node->rchild);    return 0;    }    int Tree::rearorder(Tree *node){if (!node){return 0;}rearorder(node->lchild);rearorder(node->rchild);cout << "后序遍历结果为:" << node->number << endl;   return 0;}int Tree::rear_club(Tree *node){if (node){rear_club(node->lchild);rear_club(node->rchild);if (!node->lchild){node->ltag = 1;node->lchild = pre;}if (!pre->rchild){pre->rtag = 1;pre->rchild = node;}pre = node;}return 0;} int Tree::insert_head(Tree *node){head = head->malloc_node();pre = head;head->ltag = 1;head->lchild = node;rear_club(node);head->rchild = pre;return 0;}int Tree::print_club()  {  Tree* temp = head->lchild;  Tree* par = NULL;while(true)  //循环目的 找到后序输出的正确开头 也就是最后一个左孩子{  while(temp->ltag == 0)  {temp = temp->lchild; } if(temp->rtag == 0){temp = temp->rchild; } else  {break;}  }  while(temp != head)  {  cout << "后序线索化遍历树结果为:" << temp->number << endl;par = parent(temp);  //获得节点temp的父节点 if(par == head) //若父节点是head则节点temp为根节点,无后继  {temp = head;}  else if(par->rtag == 1 || temp == par->rchild) //无右兄弟的左节点或是右儿子  {temp = par;  }else  //节点temp是左孩子,且有右兄弟  {  while(par->rtag == 0)  {  par = par->rchild;  while(par->ltag == 0)  {  par = par->lchild;  }  }  temp =par;  }  }  return 0;}Tree* Tree::parent(Tree *node)  //获取指定节点节点的父节点  {  Tree* temp = head;  if(temp->lchild == node){return temp;  }else{  temp = temp->lchild;  while(temp->lchild != node && temp->rchild != node)  {  if(temp->rtag == 0)//判断节点右孩子是否为线索 如果不是那么就进右孩子 是就进左孩子{temp = temp->rchild;  }else  {temp = temp->lchild;  //有左孩子进左孩子,没有左孩子,进前驱; } }  }  return temp;  }  

0 0
原创粉丝点击