数据结构也不是那么没意思之后序二叉树+二叉树转伪双向循环链表
2016-07-03 13:53
337 查看
全部代码
#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; }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- PHP实现的线索二叉树及二叉树遍历方法详解
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort