线索二叉树C++实现
#include<iostream>
#include<stdlib.h>
#define maxsize 100
using namespace std;
typedef struct BTNode{
char val;
struct BTNode *lchild, *rchild;
int ltag, rtag;
}BTNode, *BiNode;
BTNode* stack[maxsize];
int top = -1;
/**
* 找到中序遍历的第一个起始顶点
*/
inline BTNode* First(BTNode *root){
while(root->ltag == 0)
root = root->lchild;
return root;
}
/**
* 找到中序遍历的下一个顶点,树已被中序线索化
*/
inline BTNode* InOrderNext(BTNode *root){
if(root->rtag == 0)
return First(root->rchild);
else
return root->rchild;
}
/**
* debug,用来打印线索化之后的树的信息
*/
inline void debug(){
for(int i = 0; i <= top; i++){
cout << "[debug]: BTNode->[";
cout << (void *) stack[i];
cout << "]" << endl;
cout << " [val] :" << stack[i]->val << endl;
cout << " [lchild]:";
cout << (void *) stack[i]->lchild << endl;
cout << " [rchild]:";
cout << (void *) stack[i]->rchild << endl;
cout << " [ltag] :" << stack[i]->ltag << endl
<< " [rtag] :" << stack[i]->rtag << endl;
}
}
void CreateTree(BTNode *&root);
void PreOrderThreading(BTNode *root, BTNode *&pre);
void InOrderThreading(BTNode *root, BTNode *&pre);
void PreOrderThreadingTraversal(BTNode *root);
void InOrderThreadingTraversal(BTNode *root);
void PostOrderThreading(BTNode *root, BTNode *&pre);
void PostOrderThreadingTraversal(BTNode *root);
void CreateTree(BTNode *&root){
char c;
cin >> c;
if(c != '#'){
root = (BTNode *) malloc(sizeof(struct BTNode));
if(!root){
cerr << "No More Memory!" << endl;
exit(-1);
}
root->val = c;
root->lchild = root->rchild = NULL;
root->ltag = root->rtag = 0;
CreateTree(root->lchild);
CreateTree(root->rchild);
}else{
root = NULL;
}
}
void PreOrderThreading(BTNode *root, BTNode *&pre){
if(root){
if(!root->lchild){
root->lchild = pre;
root->ltag = 1;
}
if(pre && !pre->rchild){
pre->rchild = root;
pre->rtag = 1;
}
pre = root;
if(root->ltag == 0){
PreOrderThreading(root->lchild, pre);
}
if(root->rtag == 0){
PreOrderThreading(root->rchild, pre);
}
}
}
void PreOrderThreadingTraversal(BTNode *root){
if(root){
cout << root->val << " ";
if(root->ltag == 0){
PreOrderThreadingTraversal(root->lchild);
}else{
PreOrderThreadingTraversal(root->rchild);
}
}
}
void InOrderThreading(BTNode *root, BTNode *&pre){
if(root){
stack[++top] = root;
InOrderThreading(root->lchild, pre);
if(!root->lchild){
root->lchild = pre;
root->ltag = 1;
}
if(pre && !pre->rchild){
pre->rchild = root;
pre->rtag = 1;
}
pre = root;
InOrderThreading(root->rchild, pre);
}
}
void InOrderThreadingTraversal(BTNode *root){
for(BTNode *p = First(root); p; p = InOrderNext(p))
cout << p->val << " ";
}
void PostOrderThreading(BTNode *root, BTNode *&pre){
if(root){
stack[++top] = root;
PostOrderThreading(root->lchild, pre);
PostOrderThreading(root->rchild, pre);
if(!root->lchild){
root->lchild = pre;
root->ltag = 1;
}
if(pre && !pre->rchild){
pre->rchild = root;
pre->rtag = 1;
}
pre = root;
}
}
void PostOrderThreadingTraversal(BTNode *root){
//PostOrder需要在原有的节点的类型定义上增加一个
//parent节点,否则,遍历的时候可能会没有办法
//回到上一层节点当中
}
int main(){
BTNode *root, *pre = NULL;
CreateTree(root);
//PostOrderThreading(root, pre);
//debug();
//PostOrderThreadingTraversal(root);
return 0;
}
线索二叉树C++实现的更多相关文章
- 数据结构《9》----Threaded Binary Tree 线索二叉树
对于任意一棵节点数为 n 的二叉树,NULL 指针的数目为 n+1 , 线索树就是利用这些 "浪费" 了的指针的数据结构. Definition: "A binary ...
- 线索二叉树Threaded binary tree
摘要 按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列.在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点:除最后一个结点外每一个结点有且仅有一个直接后继结点.这 ...
- 遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化
遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化 1. 二叉树3个基本单元组成:根节点.左子树.右子树 以L.D.R ...
- 树和二叉树->线索二叉树
文字描述 从二叉树的遍历可知,遍历二叉树的输出结果可看成一个线性队列,使得每个结点(除第一个和最后一个外)在这个线形队列中有且仅有一个前驱和一个后继.但是当采用二叉链表作为二叉树的存储结构时,只能得到 ...
- 图解中序遍历线索化二叉树,中序线索二叉树遍历,C\C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 【Java】 大话数据结构(9) 树(二叉树、线索二叉树)
本文根据<大话数据结构>一书,对Java版的二叉树.线索二叉树进行了一定程度的实现. 另: 二叉排序树(二叉搜索树) 平衡二叉树(AVL树) 二叉树的性质 性质1:二叉树第i层上的结点数目 ...
- 数据结构之线索二叉树——C语言实现
线索二叉树操作 (1) 线索二叉树的表示:将每个节点中为空的做指针与右指针分别用于指针节点的前驱和后续,即可得到线索二叉树. (2) 分类:先序线索二叉树,中序线索二叉树,后续线索二叉树 (3) 增 ...
- 后序线索二叉树中查找结点*p的后继
在后序线索二叉树中查找结点*p的后继: 1.若结点*p为根,则无后继:2.若结点*p为其双亲的右孩子,则其后继为其双亲:3.若结点*p为其双亲的左孩子,且双亲无右子女,则其后继为其双亲:4.若结点*p ...
- 线索二叉树的理解和实现(Java)
线索二叉树的基本概念 我们按某种方式对二叉树进行遍历,将二叉树中所有节点排序为一个线性序列,在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点:除最后一个结点外每一个结点有且仅有一个直接后继结 ...
- [线索二叉树] [LeetCode] 不需要栈或者别的辅助空间,完成二叉树的中序遍历。题:Recover Binary Search Tree,Binary Tree Inorder Traversal
既上篇关于二叉搜索树的文章后,这篇文章介绍一种针对二叉树的新的中序遍历方式,它的特点是不需要递归或者使用栈,而是纯粹使用循环的方式,完成中序遍历. 线索二叉树介绍 首先我们引入“线索二叉树”的概念: ...
随机推荐
- 【转】Java面试题:多继承
招聘和面试对开发经理来说是一个无尽头的工作,虽然有时你可以从HR这边获得一些帮助,但是最后还是得由你来拍板,或者就像另一篇文章“Java 面试题:写一个字符串的反转”所说: 面试开发人员不仅辛苦而且乏 ...
- Django之Session与Cookie
目录 一.cookie Cookie的由来 什么是Cookie Cookie的原理 查看Cookie cookie与session的作用 二.Django中操作Cookie 获取Cookie 设置Co ...
- 三、Nginx原理解析
Nginx原理解析 一.反向代理 工作流程 用户通过域名发出访问Web服务器的请求,该域名被DNS服务器解析为反向代理服务器的IP地址: 反向代理服务器接受用户的请求: 反向代理服务器在本地缓存中查找 ...
- DOCKER学习_017:Docker-Compose介绍
dockers三驾马车 Docker Machine Docker Swarm Docker Compose 一 Docker Compose介绍 Docker Compose是一个定义和运行多容器应 ...
- Unity3d游戏角色描边
本文发布于游戏程序员刘宇的个人博客,欢迎转载,请注明来源https://www.cnblogs.com/xiaohutu/p/10834491.html 游戏里经常需要在角色上做描边,这里总结一下平时 ...
- Elasticsearch系列---结构化搜索
概要 结构化搜索针对日期.时间.数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么不符合条件在结果集之外 ...
- [题解][Codeforces]Codeforces Round #602 (Div. 1) 简要题解
orz djq_cpp lgm A 题意 给定一个分别含有 \(\frac n2\) 个左括号和右括号的括号序列 每次可以将序列的一个区间翻转 求一个不超过 \(n\) 次的操作方案,使得操作完之后的 ...
- pikachu漏洞练习之sql注入
这里因为实验的时候只记录了一部分所以就展示一部分 1.1.1数字型注入 (1)看到界面发现是查询id功能,没有在url里看到有传参所以应该是post方法提交数据. (2)进行sql注入之前我们最好是先 ...
- Dappy如何防止DNS黑客入侵
作者:Raphaël 译者注:Dappy是RChain生态中的DNS[域名系统(服务)协议].Dappy基于RChain的技术架构保障了域名系统的安全性. Dappy是一个用于文件和Web应用程序的去 ...
- LeetCode 11 水池蓄水问题
今天给大家分享的是一道LeetCode中等难度的题,难度不大,但是解法蛮有意思.我们一起来看题目: Link Container With Most Water Difficulty Medium 题 ...