先序 中序 后序 线索二叉树
来源:互联网 发布:战地2win7优化补丁 编辑:程序博客网 时间:2024/05/16 06:36
///有头结点版 + 无头结点版 啊啊啊啊啊啊 感觉自己快吐血了 T^T#include<iostream>#include<queue>using namespace std;typedef struct treenode{ char data; treenode *lchild; treenode *rchild; int LTag; int RTag;}node, *Tree;node *pre;node *create_tree(node *t){ char a; cin >> a; if(a == '0') return NULL; t = new node; t->LTag = 0; t->RTag = 0; t->data = a; t->lchild = create_tree(t->lchild); t->rchild = create_tree(t->rchild); return t;}void pre_order(node *t){ if(t){ cout << t->data; pre_order(t->lchild); pre_order(t->rchild); }}///******************in_order**************************void in_order_threading(Tree t){ if(t){ in_order_threading(t->lchild); if(t->lchild == NULL){ t->lchild = pre; t->LTag = 1; } if(pre && pre->rchild == NULL){ pre->rchild = t; pre->RTag = 1; } pre = t; in_order_threading(t->rchild); }}node * in_thread(node *p, Tree t){ p = new node; p->LTag = 0; p->RTag = 1; p->rchild = p; if(t == NULL){ p->lchild = p; } else{ p->lchild = t; pre = p; in_order_threading(t); p->rchild = pre; pre->RTag = 1; pre->rchild = p; } return p;}void in_order_traverse(node *p){ node *t; t = p->lchild; while(t!=p){ while(t->LTag == 0){///走到最左 t = t->lchild; } cout << t->data;///打印最左边的 while(t->RTag == 1 && t->rchild!=p){ t = t->rchild;///顺着线索去打印 cout << t->data; } t = t->rchild; }}///**************pre_order*************************void pre_order_threading(Tree t){ if(t){ if(t->lchild==NULL){ t->lchild = pre; t->LTag = 1; } if(pre && pre->rchild == NULL){ pre->rchild = t; pre->RTag = 1; } pre = t; if(t->LTag == 0)/// 之前写的是t->lchild 死循环了 这两个不是等价吗??? pre_order_threading(t->lchild);///终于在写后序的时候反应过来了。。。 if(t->RTag == 0)///因为我们已经把空的t->lchild赋值了 其他的是没关系的 pre_order_threading(t->rchild);///但是有一个是NULL 就是说 t->LTag == 1 }///但是t->lchild == NULL 也就是说 只有t->LTag==0 t->lchild才一定不空 return;///不管你明不明白 反正我是明白了~ 唉 困扰了我一下午的问题啊 竟然在一瞬间就有了灵感~}node *pre_thread(node *p, Tree t){ p = new node; p->LTag = 0; p->RTag = 1; p->rchild = p; if(t==NULL){ p->lchild = p; } else{ p->lchild = t; pre = p; pre_order_threading(t); p->rchild = pre; pre->RTag = 1;///现在pre是最后一个节点啦 pre->rchild = p; } return p;}void pre_order_traverse(node *p){ node *t; t = p->lchild; while(t!=p){ while(t->LTag == 0){ cout << t->data; t = t->lchild; } cout << t->data; while(t->RTag == 1 && t->rchild!=p){ t = t->rchild; cout << t->data; } t = t->rchild; }}///**************post_order*********************void post_order_threading(Tree t){ if(t){ post_order_threading(t->lchild); post_order_threading(t->rchild); if(t->lchild == NULL){ t->lchild = pre; t->LTag = 1; } if(pre&&pre->rchild == NULL){ pre->rchild = t; pre->RTag = 1; } pre = t; }}node *parent(node *t, node *p){ if(t){ queue<node *>q; while(!q.empty()) q.pop(); q.push(t); while(!q.empty()){ node *a = q.front(); q.pop(); if(a->lchild == p || a->rchild == p){ return a; } if(a->lchild) q.push(a->lchild); if(a->rchild) q.push(a->rchild); } } return NULL;}void post_order_traverse(node* t){ if (t) { node* p = t; pre = NULL; while (p) { while ( p->lchild != pre && p->LTag == 0)///走到最左 { p = p->lchild; } /// p->data == d while (p && p->RTag== 1)///顺着线索走 { cout << p->data; pre = p; p = p->rchild; } if (p == t)///若p回到了根节点 { cout << p->data; return; } while (p && p->rchild == pre) { cout << p->data; pre = p; node *s = parent(t, p); p = s; } if (p && p->RTag == 0) { p = p->rchild; } } }}int main(){ node *t; node *p; t = create_tree(t); cout << "先序遍历:"; pre_order(t); cout << endl; cout << "中序线索化:"; p = in_thread(p, t); in_order_traverse(p); cout << endl; t = create_tree(t); cout << "先序线索化:"; p = pre_thread(p, t); pre_order_traverse(p); cout << endl; t = create_tree(t); cout << "后序线索化:"; post_order_threading(t); post_order_traverse(t); cout << endl; return 0;}/*ab0d00ce000先序遍历:abdce中序线索化:bdaecab0d00ce000先序线索化:abdceab0d00ce000后序线索化:dbecaProcess returned 0 (0x0) execution time : 22.250 sPress any key to continue.*/
0 0
- 线索二叉树(先序,中序,后序)
- 先序 中序 后序 线索二叉树
- 先序,中序,后序线索化二叉树
- 二叉树线索化以及线索化的先序、中序、后序遍历
- 二叉树的线索化以及 线索化的先序,中序,后序遍历
- 先序遍历/后序遍历创建线索二叉树
- 线索二叉树的实现 先序 中序 后序
- 线索二叉树的先序、中序、后序遍历
- 树:二叉树的集中遍历方法(先序,中序,后序遍历,线索二叉树)
- 后序线索二叉树
- 后序线索二叉树
- 线索化中序、先序、后序遍历二叉树的方式(待补充完整)
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- Android性能优化——内存优化
- swift实现斗鱼界面上的观看(在线)数效果(左右渐变+右上角剪辑)
- 关于音乐播放器的一个小Demo
- 数据库存储_SQLite
- Multiple markers at this line, Syntax error on token
- 先序 中序 后序 线索二叉树
- kaldi I/O机制
- 三、HashMap源码分析
- 常见软件下载地址
- OAuth的机制原理讲解及开发流程
- 4、《Jmeter基础篇》 从此善用逻辑控制器(2)
- 卸载myeclipse时,出现“Failed to load the JNI shared library....”的解决方法
- 会话技术
- 1613-3-傅溥衍 总结《2016年11月13日》【连续四十四天总结】