数据结构也不是那么没意思之后序二叉树+二叉树转伪双向循环链表
来源:互联网 发布: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
- 数据结构也不是那么没意思之后序二叉树+二叉树转伪双向循环链表
- 数据结构也不是那么没意思之前序二叉树+二叉树转伪双向循环链表
- 数据结构也不是那么没意思之中序二叉树+二叉树转伪双向循环链表
- 数据结构也不是那么没意思之双向循环链表
- 中序遍历二叉树将遍历结果存入双向循环链表C语言实现
- 双向链表(4) - 排序二叉树转换为循环双向链表
- 二叉树------二叉查找树转化为双向链表
- 二叉树22:二叉搜索树与双向链表
- 数据结构与算法分析笔记与总结(java实现)--二叉树22:二叉搜索树与双向链表
- 二叉搜索树转换成有序的双向循环链表(一)
- 如何将一个排序二叉树转换为循环双向链表
- 二叉树的链式存储结构----(循环)双向线索链表
- 【树】二叉树转为双向链表
- 二叉树转双向链表
- 二叉查找树转为双向链表
- 排序二叉树 生成双向链表
- 二叉查找树转为双向链表
- 二叉树转双向链表
- iOS学习(二)Objective-C 第一个OC程序
- 第37课:Kafka源码解读Consumer内幕解密
- ES6入门—— ECMAScript简介
- 数组
- 业余的SSD探索笔记
- 数据结构也不是那么没意思之后序二叉树+二叉树转伪双向循环链表
- 0.资料大全,博主所有资料
- ES6入门——let和const命令
- JS 中如何拼凑html
- 2015蓝桥杯决赛Java A组 第三题--显示二叉树
- 嵌入式概述
- C++实现几大排序算法
- 遍历二叉树——递归实现
- ubuntu16安装android studio2.1