//二叉树的创建,递归遍历,非递归遍历,拷贝,深度
#include<iostream>
#include<stack>
using namespace std;
二叉树的结构
//typedef struct BiTNode
//{//  char data;//数据域
//  int LTag = 0;//左标签
//  int RTag = 0;//右标签
//  struct BiTNode* lchild = nullptr;//指针必须初始化,c11标准
//  struct BiTNode* rchild = nullptr;//左右孩子
//  struct BiTNode* parent = nullptr;//双亲
//}BiTNode, * BiTree;
二叉树的结构
//二叉树的结构
typedef struct BiTNode
{char data;//数据域int LTag = 0;//左标签int RTag = 0;//右标签struct BiTNode* lchild = nullptr;//指针必须初始化,c11标准struct BiTNode* rchild = nullptr;//左右孩子struct BiTNode* parent = nullptr;//双亲
}BiTNode, * BiTree;
//二叉树的结构
BiTree pre;//= new BiTNode;//全局变量
BiTree parent = NULL;
//二叉树的创建
void CreateBiTree(BiTree& T,BiTree P)//先序输入
{char ch;cin >> ch;if (ch == '#') T = NULL;else{T = new BiTNode;//分配空间T->data = ch;//根节点赋值T->parent = P;CreateBiTree(T->lchild,T);//建立左子树CreateBiTree(T->rchild,T);//建立右子树}
}
//二叉树的创建//复制树
void Copy(BiTree T, BiTree& NewT)
{if (T == NULL){NewT = NULL;return;}else{NewT = new BiTNode;NewT->data = T->data;Copy(NewT->lchild, T->lchild);Copy(NewT->rchild, T->rchild);}
}
//复制树//计算树的深度
int Depth(BiTree T)
{if (T == NULL) return 0;else{int m = Depth(T->lchild);int n = Depth(T->rchild);if (m > n) return (m + 1);else return (n + 1);}return 0;
}
//计算树的深度//节点数量
int NodeCount(BiTree T)
{if (T == NULL) return 0;else return (NodeCount(T->lchild) + NodeCount(T->rchild) + 1);
}
//节点数量//以结点T为根的子树先序线索化
void PreThreading(BiTree& T)
{if (T)//T非空{if (!T->lchild)//左子树为空{T->LTag = 1;T->lchild = pre;}else{T->LTag = 0;}if (!pre->rchild){pre->RTag = 1;pre->rchild = T;}else{T->RTag = 0;}pre = T;if (T->LTag == 0){PreThreading(T->lchild);//遍历左子树}if (T->RTag == 0){PreThreading(T->rchild);//遍历右子树}}
}
//以结点T为根的字树先序线索化//带头节点的二叉树先序线索化
void PreOrderThreading(BiTree& Thrt, BiTree T)
{Thrt = new BiTNode;Thrt->LTag = 0;Thrt->RTag = 1;Thrt->rchild = Thrt;if (!T){Thrt->lchild = Thrt;}else{Thrt->lchild = T;pre = Thrt;PreThreading(T);pre->rchild = Thrt;pre->RTag = 1;Thrt->rchild = pre;}
}
//带头节点的二叉树先序线索化//遍历先序线索二叉树
void PreTraverse_Thr(BiTree T)
{BiTree p = T->lchild;while (p != T){cout << p->data;if (p->LTag == 0){p = p->lchild;}else{p = p->rchild;}}
}
//遍历先序线索二叉树//以结点T为根的子树中序线索化
void InThreading(BiTree &T)
{if (T)//T非空{InThreading(T->lchild);//遍历左子树if (!T->lchild)//左子树为空{T->LTag = 1;T->lchild = pre;}else{T->LTag = 0;}if (!pre->rchild){pre->RTag = 1;pre->rchild = T;}else{T->RTag = 0;}pre = T;InThreading(T->rchild);}
}
//以结点T为根的字树中序线索化//带头节点的二叉树中序线索化
void InOrderThreading(BiTree& Thrt, BiTree T)
{Thrt = new BiTNode;Thrt->LTag = 0;Thrt->RTag = 1;Thrt->rchild = Thrt;if (!T){Thrt->lchild = Thrt;}else{Thrt->lchild = T;pre = Thrt;InThreading(T);pre->rchild = Thrt;pre->RTag = 1;Thrt->rchild = pre;}
}
//带头节点的二叉树中序线索化//遍历中序线索二叉树
void InTraverse_Thr(BiTree T)
{BiTree p = T->lchild;//while (p != T){while (p->LTag == 0){p = p->lchild;}cout << p->data;while (p->RTag == 1 && p->rchild != T){p = p->rchild;cout << p->data;}p = p->rchild;}
}
//遍历中序线索二叉树//以结点T为根的子树后序线索化
void PosThreading(BiTree& T)
{if (T)//T非空{PosThreading(T->lchild);//遍历左子树PosThreading(T->rchild);//遍历右子树if (!T->lchild)//左子树为空{T->LTag = 1;T->lchild = pre;}else{T->LTag = 0;}if (!pre->rchild){pre->RTag = 1;pre->rchild = T;}else{T->RTag = 0;}pre = T;}
}
//以结点T为根的字树后序线索化//带头节点的二叉树后序线索化
void PosOrderThreading(BiTree& Thrt, BiTree T)
{Thrt = new BiTNode;Thrt->LTag = 0;Thrt->RTag = 1;Thrt->rchild = T;if (!T){Thrt->lchild = Thrt;}else{Thrt->lchild = T;pre = Thrt; PosThreading(T);}
}
//带头节点的二叉树后序线索化//遍历后序线索二叉树
//后序遍历需要双亲节点
void PosTraverse_Thr(BiTree T)
{BiTree root = T->lchild;//初始节点BiTree prev = nullptr;//记录上一个节点while (root){if (root->lchild == root->rchild)//如果双亲没有左子树或者右子树{root = root->rchild;}while (root->LTag == 0 && root->lchild != prev)//找到最左边的节点{root = root->lchild;}while (root->RTag == 1)//输出并遍历节点的后继{cout << root->data;prev = root;//记录上一个节点root = root->rchild;}if (root == T->lchild)//判断是不是根节点{cout << root->data;return;}while (root->rchild == prev)//不是根节点,访问当前节点的双亲节点{cout << root->data;prev = root;root = root->parent;if (root == nullptr)//遍历到根节点,退出{return;}}if (root->RTag == 0)//遍历右子树{root = root->rchild;}}
}
//遍历后序线索二叉树int main()
{BiTree T;BiTree P = nullptr;BiTree Thrt;cout << "树的先序遍历为:";CreateBiTree(T,P);InOrderThreading(Thrt, T);InTraverse_Thr(Thrt);/*cout << endl;cout << "前序遍历:";PreTraverse(T);cout << endl;cout << "中序遍历:";InTraverse(T);cout << endl;cout << "后序遍历:";PosTraverse(T);cout << endl;cout << "先序遍历的非递归算法为:";NoPreTraverse(T);cout << endl;cout << "中序遍历的非递归算法为:";NoInTraverse(T);cout << endl;cout << "后序遍历的非递归算法为:";NoPosTraverse(T);cout << endl;cout << "树的深度为:" << Depth(T) << endl;cout << "树的节点个数为:" << NodeCount(T) << endl;cout << "树的叶结点个数为:" << NodeCount(T) << endl;*/return 0;
}

二叉线索树的线索化以及遍历相关推荐

  1. “后序遍历二叉运算树进行Lambda演算的化简”带来的联系

    今天闲来无事,想到一个自以为绝妙的想法,那就是用后序遍历二叉树Lambda演算的化简. 数据结构与算法中,我们想写个计算器就必须遇到一个问题,表达式求值!其实表达式很多就是我们所谓的现实生活中的问题解 ...

  2. 树形结构:二叉排列树,二叉搜索树

    二叉排列树,二叉搜索树 这个数听见得比较多,含义是:左边<=中间<=右边,换句话来说使用中序遍历最后得到结果就是一个有序得序列. 建立一颗二叉排列树 class BinTNode:def ...

  3. 【CVPR2020-中科院-腾讯优图】基于注意力卷积二叉神经树的细粒度视觉分类

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 本文由腾讯优图实验室和中科院软件所联合提出.细粒度视觉分类(Fine-Graine ...

  4. 统计学习方法第五章作业:ID3/C4.5算法分类决策树、平方误差二叉回归树代码实现

    ID3/C4.5算法分类决策树 import numpy as np import math class Node:def __init__(self,feature_index=None,value ...

  5. 下拉菜单实现树状结构_二叉索引树(树状数组)的原理

    背景 了解到二叉索引树这个数据结构,是在 leetcode 的 307 题,题目是要求实现一个数据结构,可以返回数组任意区间的和以及更新数组的某个值. 307.Range Sum Query - Mu ...

  6. 二叉索引树 -- 区间信息的维护与查询

    二叉索引树,俗称树状数组,也叫Fenwick树. 例: 给定一个n个元素的数组A1, A2, A3, --, An, 设计一个数据结构,支持以下两种操作. 1.Add  x  y       :让Ax ...

  7. 数据结构学习记录(二)——折半查找二叉判定树的画法

    以下给出我在学习中总结的一种比较简便的构造折半二叉判定树的思路以及方法: 思路分析: 在计算mid值时,使用的时mid=(low+high)/2  .这里由于mid为int类型,自动默认为向下取整,因 ...

  8. 1597. 根据中缀表达式构造二叉表达式树 双端队列

    1597. 根据中缀表达式构造二叉表达式树 给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时 ...

  9. 二叉苹果树(树型DP+背包)

    二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号 ...

  10. [数据结构] 图解线索树的后继查找,遍历

    可以把 左根右 这个顺序先写出来,把他们按照二叉树的形式排列 然后就会涉及到不同的 左根右,这个时候因为是在画理解图嘛,所以可以把上一次的 左根右 中的左右结点作为下一次的根,这样就可以写两层 左根右 ...

最新文章

  1. Ajax简单的请求数据以表格的形式渲染到页面
  2. [NOIP2007] 提高组 洛谷P1099 树网的核
  3. 第六章 BitArray类
  4. adb architecture
  5. Nutch关于robot.txt的处理
  6. pythonpil库过滤图像contour_一秒钟带你走进P图世界-----(python)PIL库的使用
  7. java webservice 线程_编程实践笔记{Java 线程 并发处理 Webservice}
  8. Java反编译生成java文件
  9. 创意网页排版设计和教程分享,打造 “视”不可挡的网页设计
  10. Selenium04-selenium中的Xpath元素定位方法爬虫实践
  11. 计算机如何将两个磁盘合在一起,如何把两个磁盘合并在一起?
  12. 腾讯百度之间地图经纬度的转换
  13. 元旦有什么国产蓝牙耳机推荐?2022音质好的蓝牙耳机选购指南
  14. html5/css实现字体上划线
  15. Minio服务端和客户端部署说明
  16. 2020十月蓝桥杯B组省赛
  17. 程序员『天梯排行榜』
  18. mysql 恢复delete操作_MySQL 误操作后数据恢复(update,delete忘加where条件)
  19. 暑假N天乐 —— 多重+分组背包及变形
  20. 洛谷 B3618 寻找团伙

热门文章

  1. 大数据_Hbase-shell命令_操作hbase_完成对表的增删改查---Hbase工作笔记0005
  2. JAVA面试要点002_Git中fetch和pull的区别
  3. 在caffe中添加样本扩增的功能
  4. 1002 C语言输入解决方案
  5. 在实验室服务器毫无阻拦的安装pip3
  6. 为什么牛顿法下降的速度比梯度下降的快
  7. Linux yum更新源url
  8. sigaction介绍
  9. invalid use of incomplete type 报
  10. laravel无法运行php,Laravel:php artisan服务无法启动