线索二叉树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
既上篇关于二叉搜索树的文章后,这篇文章介绍一种针对二叉树的新的中序遍历方式,它的特点是不需要递归或者使用栈,而是纯粹使用循环的方式,完成中序遍历. 线索二叉树介绍 首先我们引入“线索二叉树”的概念: ...
随机推荐
- 关于django中的get_or_create方法的坑
最近在项目中发现了这样的一个坑,那就是我们的需求是不能添加一个相同的对象到数据库中,就通过某些字段的值组合成唯一值到数据库中去查找数据,如果没有找到对象,那就创建一条新的数据库记录,而刚好django ...
- spring注入相关注解
本次主要整理四个注解 @ComponentScan.@Scope.@Conditional.@Import 1. @ComponentScan(value = "com.xiaoguo&qu ...
- JSON的学习与使用
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- TCP/IP协议与HTTP协议(一)
1.什么是TCP/IP 如果要了解一个人,可以从他归属的集体聊起来.我们的HTTP协议就属于TCP/IP协议家族中的一员,了解HTTP协议再整个网络流程中的地位,也能更加充分的理解HTTP协议. 要 ...
- Window初始化Git环境
安装Git 去到官网下载地址,找到自己电脑的对应版本,下载安装就好啦,这里就不一一说明了 https://git-scm.com/download/win 初始化Git环境 第一步:打开git-bas ...
- [bzoj4447] [loj#2010] [Scoi2015] 小凸解密码
Description 小凸得到了一个密码盘,密码盘被等分成 \(N\) 个扇形,每个扇形上有一个数字(0-9),和一个符号("+"或"*") 密码盘解密的方法 ...
- 【javaScript】加减乘除的精确计算
在js中使用"+"."-"等符号进行运算会出现很大的误差,所以需要自己创建函数进行精确运算. //说明:javascript的加法结果会有误差,在两个浮点数相加 ...
- 实用代码|Linux定时检查应用状态
有时候,我们挂在服务器上的应用会因为一些特殊情况挂掉,致使项目经理又对我们说:又挂了!赶紧去看看!于是又了以下脚本,使用shell编写,用于定时检查应用情况,挂掉则重启.这里以tomcat为例. 根据 ...
- 【Java面试】Mybatis篇
1.MyBatis编程步骤是什么样的? ① 创建SqlSessionFactory ② 通过SqlSessionFactory创建SqlSession ③ 通过sqlsession执行数据库操作 ④ ...
- Client API Object Model - Grid Context(3.3)
Grids 网格,以表格的形式显示数据, 网格可以跨越整个form,也可以是form中的一项. 被称为子网格(subgrid). grid有两种, 一种是read-only grid, 另一种是edi ...