图解前序遍历线索化二叉树,前序线索二叉树遍历,C\C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
二叉树输入过程:ABDH##I##EJ###CF##G## | 前序遍历:ABDHIEJCFG |
#include<iostream>
using namespace std;
enum TBT{child=0,thread};
typedef struct tbt
{
struct tbt* lchild;
enum TBT ltag;
char data;
enum TBT rtag;
struct tbt* rchild;
}TBTreeNode,*pTBTree;
int createThreadedBinaryTree(pTBTree& root);
void preorderThreadingBinaryTree(const pTBTree& root,TBTreeNode*&pre);
void preorderThreadedBinaryTreeTraversal(pTBTree root);
int main()
{
TBTreeNode* root = nullptr;
int ret = createThreadedBinaryTree(root);
if(0==ret)
{
TBTreeNode* pre = nullptr;
preorderThreadingBinaryTree(root,pre);
cout<<"preorder traversal Threaded Binary Tree:"<<endl;
preorderThreadedBinaryTreeTraversal(root);
cout<<endl;
}
system("pause");
}
|
int createThreadedBinaryTree(pTBTree& root)
{
char data;
if(cin>>data)
{
if('#'==data)
{
root = nullptr;
return -1;
}
root = new TBTreeNode();
root->data = data;
createThreadedBinaryTree(root->lchild);
createThreadedBinaryTree(root->rchild);
}
return 0;
}
void preorderThreadingBinaryTree(const pTBTree& root,TBTreeNode*&pre)
{
if(nullptr==root)
return ;
/* 参考前序遍历
cout<<root->data;
preorderTraversal(root->lchild);
preorderTraversal(root->rchild);
*/
// 访问顺序:根结点,左子树,右子树
//pre永远指向当前访问结点root的前一个访问过的结点,初始为null
if(nullptr==root->lchild)
{
root->lchild = pre;
root->ltag = thread;
}
if(nullptr!=pre&&nullptr==pre->rchild)
{ //要线索化一个结点的后继,按照前序遍历顺序,只能访问到root的时候才能线索化前一个结点pre的后继,前提pre要不是null,并且没有右子树
pre->rchild = root;
pre->rtag = thread;
}
pre = root;
//区别于中序线索化二叉树,因为当前结点先访问到,同时给线索化了
//所以下面访问左右子树就要判断一下是真的有左右子树而不是线索化的前驱后继
if(child==root->ltag)
{
preorderThreadingBinaryTree(root->lchild,pre);
}
if(child==root->rtag)
{
preorderThreadingBinaryTree(root->rchild,pre);
}
}
void preorderThreadedBinaryTreeTraversal(pTBTree root)
{
if(nullptr==root)
return ;
while(nullptr!=root)
{
while(nullptr!=root->lchild&&
child==root->ltag)
{
cout<<root->data<<" "; //访问根结点
root = root->lchild; //继续访问左子树
}
//左子树的最左边结点
cout<<root->data<<" ";
//通过后继遍历下一个要访问的结点
while(thread==root->rtag) //当前结点有后继
{
cout<<root->rchild->data<<" "; //输出后继
root = root->rchild; //更新根结点
}
//如果结点没有后继,那么就是有右子树
//针对这样的情况,先判断当前结点有没有左子树,有就更新根结点先遍历左子树
if(child==root->ltag)
root = root->lchild;
//没有就遍历右子树
else
root = root->rchild;
}
}
|
图解前序遍历线索化二叉树,前序线索二叉树遍历,C\C++描述的更多相关文章
- 图解中序遍历线索化二叉树,中序线索二叉树遍历,C\C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- C#数据结构-线索化二叉树
为什么线索化二叉树? 对于二叉树的遍历,我们知道每个节点的前驱与后继,但是这是建立在遍历的基础上,否则我们只知道后续的左右子树.现在我们充分利用二叉树左右子树的空节点,分别指向当前节点的前驱.后继,便 ...
- 线索化二叉树的构建与先序,中序遍历(C++版)
贴出学习C++数据结构线索化二叉树的过程, 方便和我一样的新手进行测试和学习 同时欢迎各位大神纠正. 不同与普通二叉树的地方会用背景色填充 //BinTreeNode_Thr.h enum Point ...
- 后序线索化二叉树(Java版)
前面介绍了前序线索化二叉树.中序线索化二叉树,本文将介绍后序线索化二叉树.之所以用单独的一篇文章来分析后序线索化二叉树,是因为后序线索化二叉树比前序.中序要复杂一些:另外在复习线索化二叉树的过程中,大 ...
- 数据结构与算法---线索化二叉树(Threaded BinaryTree)
先看一个问题 将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树 问题分析: 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } 但是 6, 8 ...
- YTU 3026: 中序线索化二叉树
原文链接:https://www.dreamwings.cn/ytu3026/2896.html 3026: 中序线索化二叉树 时间限制: 1 Sec 内存限制: 128 MB 提交: 9 解决: ...
- JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树 基础理论 首先,二叉树递归遍历分为先序遍历.中序遍历和后序遍历. 先序遍历为:根节点+左子树+右子树 中序遍历为:左子树+根节点+右子树 后序遍历为:左子树+右子树+根节 ...
- LeetCode 590. N叉树的后序遍历(N-ary Tree Postorder Traversal)
590. N叉树的后序遍历 590. N-ary Tree Postorder Traversal 题目描述 给定一个 N 叉树,返回其节点值的后序遍历. LeetCode590. N-ary Tre ...
- 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历
[二叉树遍历模版]前序遍历 1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...
随机推荐
- python实现邮件接口——smtplib模块
1. 思路 使用脚本发送邮件的思路其实和客户端发送邮件一样,过程都是: 登录 —> 写邮件 —> 发送 只不过通过脚本发送时我们需要考虑到整个过程的方方面面.以下为思路导图: 2. Pyt ...
- 生成pyd文件时提示“Unable to find vcvarsall.bat”的问题
本文内容 Unable to find vcvarsall.bat的问题描述 问题分析 总结 一.问题描述 我们在windows下通过pip安装一些外部Python 模块(比如,pycrypto)时通 ...
- 动态规划-最大的正方形面积 Maximal Square
2018-09-13 19:19:44 问题描述: 问题求解: 方法一: 使用动态规划来求解,算法时间复杂度O(n^2). dp[i][j] : 以(i, j)为右下角的面积最大的正方形的边长. 初始 ...
- 日常英语---十四、Dolce & Gabbana cancels China show amid 'racist' ad controversy(adj.温柔的,prep.在其中)
日常英语---十四.Dolce & Gabbana cancels China show amid 'racist' ad controversy(adj.温柔的,prep.在其中) 一.总结 ...
- English trip V1 - 9.Do you Ever Say Never? 你有没有说永远不会? Teacher:Lamb Key: Adverbs of frequency (频率副词)
In this lesson you will learn to describe what you do at home. 在本课中,您将学习如何描述您在家中所做的事情. 课上内容(Lesson) ...
- FreeBSD之基本配置
1. 设置IP地址.网关ee /etc/rc.conf ifconfig_em0="inet 192.168.21.173 netmask 255.255.255.0" #设置 ...
- 「SDOI2008」Sandy 的卡片
用第一个串建立后缀自动机.然后别的串在上面跑.从根节点开始.如果当前不能转移,一直移到slink或者根.如果移到根,能匹配长度变为0,否则变为maxlen[能转移的点]+1,再转移.转移完往slink ...
- grid 用于同一用例在不同测试环境下的测试结果
步骤: 1.http://www.seleniumhp.org/download 下载selenium standalone server 2.配置java环境 3.运行selenium serv ...
- Luffy之Xadmin以及首页搭建(轮播图,导航)
1. 首页 1.1 轮播图 admin站点配置支持图片上传 pip install Pillow 默认情况下,Django会将上传的图片保存在本地服务器上,需要配置保存的路径.我们可以将上传的文件保存 ...
- CF438D 线段树 区间求和,区间求膜,单点更新
题目链接 题目大意: 给定一个长度为n的序列,要求能够执行m次下列操作: 1.查询区间[l,r]的和 2.将区间[l,r]的每一个数%=mod 3.修改第x个数为y 操作1,3都是线段树的基本操作,线 ...