二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。二叉树作为存储结构时,一个节点只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱或后继信息。

也就是说,线索二叉树就是充分利用二叉树节点中的空指针,让它们分别指向本节点的前驱或者后继。既充分利用了资源,又方便我们遍历这颗二叉树。

1、线索二叉树的概念

n个节点的二叉树中含有n+1个空指针域。利用二叉树中的空指针域 来存放在某种遍历次序下的前驱和后继 ,这种指针叫“线索”。这种加上了线索的二叉树称为线索二叉树(Threaded BinaryTree)。根据遍历次序的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。

2、线索二叉树结构定义

/*线索化二叉树的结构*/

enumFlag

{

LINK,

CLUE

};structTreeNode

{

TreeNode(intx) : value(x), left(NULL), right(NULL), left_flag(LINK), right_flag(LINK) {};intvalue;

TreeNode*left;

TreeNode*right;

Flag left_flag;

Flag right_flag;

};

value

left

left_flag

right

right_flag

3、前序线索二叉树实现

/*前序遍历的构建*/

void prevCreate(TreeNode *root, TreeNode *&prev) //&prev用引用,相当于全局变量的作用,在整个递归过程传递

{if(root)

{if(root->left ==NULL)

{

root->left_flag =CLUE;

root->left =prev;

}if(prev && prev->right ==NULL)

{

prev->right_flag =CLUE;

prev->right =root;

}

prev=root;if(!root->left_flag)

{

prevCreate(root->left, prev);

}

prevCreate(root->right, prev);

}

}

/*前序线索下的遍历*/

void prevOrder(TreeNode *root)

{while(root)

{while(root->left_flag !=CLUE)

{

cout<< root->value << " ";

root= root->left;

}

cout<< root->value << " ";

root= root->right;

}

cout<

}

4、中序线索二叉树实现

/*中序遍历的构建*/

void inCreate(TreeNode *root, TreeNode *&prev)

{if(root)

{

inCreate(root->left, prev);if(root->left ==NULL)

{

root->left_flag =CLUE;

root->left =prev;

}if(prev && prev->right ==NULL)

{

prev->right_flag =CLUE;

prev->right =root;

}

prev=root;

inCreate(root->right, prev);

}

}

/*中序线索下的遍历*/

void inOrder(TreeNode *root)

{while(root)

{while(root->left_flag !=CLUE)

root= root->left;

cout<< root->value << " ";while(root->right_flag !=LINK)

{

root= root->right;

cout<< root->value << " ";

}

root= root->right;

}

cout<

}

5、线索化思想拓展

题目:如何将一个二叉树转化成一个有序的双向链表?

在没有学线索化之前,这道题可能非常麻烦。但现在,利用中序线索化的思想就可以很快将这道题做出来!

/*利用中序线索化思想将二叉树转换成有序的双向链表*/

void TreeToList(TreeNode *root)

{static TreeNode *prev = NULL; //设立prev保存上一次访问的节点

if(root == NULL) //根节点为空,直接返回

return;

TreeToList(root->left); //递归左子树

root->left = prev; //让左指针指向上一次访问的节点,即前驱

if(prev)

prev->right = root; //让prev指向当前节点,构成双向

prev = root; //更新prev

TreeToList(root->right); //递归右子树

}

本博文参考https://www.cnblogs.com/shihaochangeworld/p/5473163.html

二叉树线索化示意图_二叉树的线索化相关推荐

  1. 二叉树线索化示意图_二叉树的线索化算法思想详解

    二叉树的线索化,这几天以来我很难掌握,今天终于想通了,哈哈,首先我们来看看二叉树线索化之后会变成什么样子,这里我们以图中的二叉树为例,图如下: 画的太糙,各位看官讲究着看吧- -.所谓二叉树的线索化, ...

  2. 二叉树线索化示意图_二叉树线索化

    程序代码: 1 #include 2 using namespacestd;3 typedef enum 4 {5 LINK,6 THREAD7 }PointerTag;8 template 9 st ...

  3. java二叉树求权值_二叉树中的权值是什么?

    展开全部 二叉树中的权值就是对叶子结点赋予的一个有意义的数量值. 一棵深度为k,且有2^k-1个节点的二叉树,32313133353236313431303231363533e58685e5aeb93 ...

  4. Java二叉树逆序遍历_二叉树遍历小结

    二叉树遍历小结 声明 0 二叉树遍历概述 二叉树遍历:按照既定序,对每个节点仅访问一次: 二叉树非递归遍历思想:参考这篇博文,核心思想是存在重合元素的局部有序保证整体有序,由于二叉树的结构特点,二叉树 ...

  5. 二叉树深度和高度_二叉树的高度和深度

    二叉树深度和高度 In this tutorial, we will learn how to find height and depth of binary tree with program im ...

  6. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

    1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...

  7. 二叉树后序遍历_二叉树后序遍历非递归实现

    二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...

  8. Java交换二叉树的左右子树_二叉树左右子树交换

    1. 递归 2. 栈 package org.skyeye.test; import java.util.Stack; public class TreeSwap { public static cl ...

  9. seo结构化数据_为什么使用结构化数据有助于您网站的SEO

    seo结构化数据 Few things are as exciting for a new developer as getting their first customers. The idea o ...

最新文章

  1. 使用wsimport生成本地调用代码
  2. mysql修改主键属性_mysql如何改变主键属性
  3. SpringMVC学习03之使用注解开发SpringMVC
  4. 性能测试工具curl-loader(linux)
  5. python以缩进对齐的方式划分语句块_python以什么划分语句块
  6. python yield from yield_python yield和yield from用法总结详解 python yield和yield from用法总结...
  7. 双流棠湖中学怎么样_2020年双流中学和棠湖中学哪个好?
  8. java填空题_Java语言基础知识填空题
  9. 前端学习(504):垂直居中的第一种方式
  10. 发消息给非windows窗体程序
  11. 昂着头的艺术-伯爵在城堡的日记
  12. python迷你停车场管理系统_python实现停车管理系统
  13. Geos库在Windows上的编译
  14. CVE-2019-0708高危漏洞,各家安全厂商的扫描修复方案
  15. android 点击 加qq群,Android一键加QQ群
  16. 爬虫不借助浏览器登录_借助Android音乐播放器和旅行组合踏上道路
  17. 第2章 获得文本语料和词汇资源
  18. IPhone触摸设计:拇指操作的“热区与死角”
  19. 通过ip地址访问其他电脑的共享文件
  20. python的学习笔记案例3--基础代谢率计算1.0

热门文章

  1. 【windows】windows允许 ICMP协议(允许ping)
  2. python颜色相关系数_python相关系数 - osc_w6qmyr6s的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. php 延时显示代码,php 延时显示代码
  4. 质量管理系统_智慧工地管理系统,进度安全质量三合一
  5. 洛谷P3389 【模板】高斯消元法
  6. 函数指针数组指针+结构体数组
  7. heartbeat+iscsi+mysql实现双机高可用
  8. bzoj1217: [HNOI2003]消防局的设立 [树形dp]
  9. Java核心类库-IO-File类介绍和路径分割符
  10. oracle 常用知识点整理