1、中序线索化二叉树

  创建如上的二叉树,线索化二叉树时,根据指定的遍历方式得到的节点的访问顺序,一个节点前面的节点,叫做前驱节点,一个节点后面的节点,叫做后继节点。

  线索化二叉树的规则:

  按照某一遍历规则。记录当前节点(cur),上次访问的节点(pre)。

   ① 如果当前节点的左孩子为空 (cur.leftNode == null),就让当前节点的左指针指向它的前驱节点 ,并把当前节点左指针的模式修改为线索类型 (cur.leftNode = pre ,cur.leftType = 1)。

   ② 如果当前节点的前驱节点的右孩子为空 (pre.rightNode == null),就让当前节点的前驱节点的右指针指向当前节点,并把前驱节点的右指针修改为线索类型 (pre.rightNode = cur ,pre.rightType = 1)。

代码实现:

/**

* 线索二叉树节点

*/

public class ThreadedNode {

//节点的权

int value;

//节点的左右孩子节点

ThreadedNode leftNode;

ThreadedNode rightNode;

//表示指针的类型

int leftType;

int rightType;

//设置节点的权值

public ThreadedNode(int value) {

this.value = value;

}

//设置节点的左右孩子节点

public void setLeftNode(ThreadedNode leftNode) {

this.leftNode = leftNode;

}

public void setRightNode(ThreadedNode rightNode) {

this.rightNode = rightNode;

}

//获取节点的左右孩子节点

public ThreadedNode getLeftNode() {

return this.leftNode;

}

public ThreadedNode getRightNode() {

return this.rightNode;

}

public void midShow() {

//先遍历左子树

if (this.leftNode != null){

leftNode.midShow();

}

//打印当前节点的权值

System.out.println(this.value);

if (this.rightNode != null){

rightNode.midShow();

}

}

}

/**

* 线索二叉树

*/

public class ThreadedBinaryTree {

//树的根节点

ThreadedNode rootNode;

//用于临时存储前驱节点

ThreadedNode pre = null;

//设置二叉树的根节点

public void setRootNode(ThreadedNode rootNode) {

this.rootNode = rootNode;

}

//获取二叉树的根节点

public ThreadedNode getRootNode() {

return this.rootNode;

}

//中序线索化二叉树

public void threadNode() {

threadNodes(rootNode);

}

private void threadNodes(ThreadedNode node) {

//当前节点为空,直接返回

if (node == null) {

return;

}

//处理左子树

threadNodes(node.leftNode);

//处理前驱节点

if (pre != null && node.leftNode == null) {

//当前节点的左指针指向前驱节点

node.leftNode = pre;

//修改节点为线索模式

node.leftType = 1;

}

//处理前驱节点的右指针

if (pre != null && pre.rightNode == null) {

pre.rightNode = node;

pre.rightType = 1;

}

//当前节点就是下一个节点的前驱节点

pre = node;

//处理右子树

threadNodes(node.rightNode);

}

//中序遍历二叉树

public void midShow() {

if (this.rootNode == null) {

return;

} else {

rootNode.midShow();

}

}

}

/**

* 测试类

*/

public class TestThreadedBinaryTree {

public static void main(String[] args) {

//1、创建二叉树

ThreadedBinaryTree binaryTree = new ThreadedBinaryTree();

ThreadedNode rootNode = new ThreadedNode(1);

binaryTree.setRootNode(rootNode);

ThreadedNode leftNode = new ThreadedNode(2);

ThreadedNode rightNode = new ThreadedNode(3);

rootNode.setLeftNode(leftNode);

rootNode.setRightNode(rightNode);

leftNode.setLeftNode(new ThreadedNode(4));

ThreadedNode five = new ThreadedNode(5);

leftNode.setRightNode(five);

rightNode.setLeftNode(new ThreadedNode(6));

rightNode.setRightNode(new ThreadedNode(7));

//2、中序遍历二叉树

System.out.println("中序遍历结果:");

binaryTree.midShow();

System.out.println("------------------------");

binaryTree.threadNode();

ThreadedNode beforeNode = five.leftNode;

System.out.println("节点5的前驱节点:"+beforeNode.value);

ThreadedNode afterNode = five.rightNode;

System.out.println("节点5的后继节点:"+afterNode.value);

}

}

node 获取表单数据 为空_程序员:数据结构和算法,中序线索化二叉树相关推荐

  1. node 获取表单数据 为空_数据结构与算法(python)单向链表篇

    链表 数据表的构建需要预先知道数据的大小来申请连续的存储空间, 而在进行扩充的时候又需要进行数据的搬迁, 使用起来不是很灵活. 链表结构可以充分利用计算机内存空间, 实现灵活的内存动态管理. 简单来说 ...

  2. node 获取表单数据 为空_像声明类型一样写表单——基础功能

    从最简单的开始实现,先看一个最简单的场景 先实现这一部分. 首先,我们要遵循一个基本原则,尽量写视图无关的代码. 所以我们把整套代码分成两部分: Core:核心部分,没有任何 React 相关代码的数 ...

  3. node 获取表单数据 为空_数据结构与算法(python)单向循环链表

    单向循环链表 单链表的一个变形是单向循环链表, 链表的最后一个节点的next域不再为None, 而是指向链表的头节点. 单向循环链表如图所示: 单向循环链表 同样单向循环链表也是要使用python来对 ...

  4. node 获取表单数据 为空_寻offer之JS数据结构与算法 -- 栈

    栈 栈是一个线性结构,在计算机中是一种相当常见的数据结构. 栈与数组对比 我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据.但是有时候,我们为了实现某些功能,必须对这种任意性加以限制 ...

  5. node 获取表单数据 为空_Java实现数据结构之【链表】

    链表相比于前几个章节讲的数据结构而言,是一个真正的动态数据结构也是一个最简单的动态数据结构,我们在后面还会接触更多的动态数据结构,所以对链表有一个理解非常好的基础,就能够更加容易的学习后面更加复杂的数 ...

  6. python获取表单数据的代码_使用flask和python从html表单获取表单数据

    我正在尝试在按下submit时从文本字段中获取表单数据,以便将其放入json格式并作为另一个页面访问json数据,该页面将是localhost:5000/info.每次我试图用request.form ...

  7. 实验一 线性表的顺序存储与实现_程序员:数据结构与算法,线性表介绍

    线性表 线性表(list):零个或多个数据元素的有限序列. 举个例子:一个班的小朋友,一个跟着一个排队,当中的每个小朋友都知道他前面的是谁,后面的是谁,如同一根线把他们串联起来.就可以称之为线性表. ...

  8. element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...

    作者:凹凸实验室 链接:https://juejin.im/post/5ebb4346e51d451ef53793ad 整体思路 第一步是结合项目背景,调研比较优化的解决方案. 文件上传失败是老生常谈 ...

  9. mysql中decimal不能为空吗_程序员,知道Mysql中事务ACID的原理吗?

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,A ...

最新文章

  1. 查看linux系统版本信息 lsb_release -a
  2. 变频电源要怎么测定额定容量
  3. python 调用linux命令-Python 调用系统命令
  4. 【科普】一图区分 IAAS + PAAS + SAAS
  5. MySQL的MyISAM和InnoDB存储引擎表结构
  6. 【Hibernate】Hibernate实体关系映射实例解析
  7. JavaScript中的数组和字符串
  8. 安德鲁斯Selector简介
  9. Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇
  10. (转)em重建全过程
  11. 【AI面试题】GBDT原理、如何用于分类、常用损失函数
  12. WINCE的KITL调试环境
  13. 关于Adobe AIR 获取屏幕信息及任务栏高度.
  14. 16、小程序OCR字体识别
  15. iOS 初中级工程师简历指南
  16. 国家认证的Python技术工程师有什么能力要求?
  17. Spark Stanalone HA_JZZ158_MBY
  18. 通信方面工作一些简单的名词解释整理
  19. 新架构、新场景、新范式之下 数字化转型的“懂行”驱动力
  20. 每日一题:1220. 统计元音字母序列的数目(Count Vowels Permutation)

热门文章

  1. UIElements开发人员指南9 样式(Style)和Unity样式表(style sheets)
  2. Keil下AStyle自动格式化代码
  3. win7家庭版升级成旗舰版
  4. 一个比较vista的vista主题for rf5.0fb(转)
  5. 一起脱去小程序的外套和内衣 - 微信小程序架构解析
  6. 算法与程序设计(二):递归
  7. 使用javamail发邮件出现javax.mail.MessagingException: Unknown SMTP host: smtp.qq.com的解决方案
  8. KEGGDrug数据库字段认识
  9. 【精彩回顾】迪拜BSV全球区块链大会Day3
  10. 现在连收银员也要考试了吗?