node 获取表单数据 为空_程序员:数据结构和算法,中序线索化二叉树
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 获取表单数据 为空_程序员:数据结构和算法,中序线索化二叉树相关推荐
- node 获取表单数据 为空_数据结构与算法(python)单向链表篇
链表 数据表的构建需要预先知道数据的大小来申请连续的存储空间, 而在进行扩充的时候又需要进行数据的搬迁, 使用起来不是很灵活. 链表结构可以充分利用计算机内存空间, 实现灵活的内存动态管理. 简单来说 ...
- node 获取表单数据 为空_像声明类型一样写表单——基础功能
从最简单的开始实现,先看一个最简单的场景 先实现这一部分. 首先,我们要遵循一个基本原则,尽量写视图无关的代码. 所以我们把整套代码分成两部分: Core:核心部分,没有任何 React 相关代码的数 ...
- node 获取表单数据 为空_数据结构与算法(python)单向循环链表
单向循环链表 单链表的一个变形是单向循环链表, 链表的最后一个节点的next域不再为None, 而是指向链表的头节点. 单向循环链表如图所示: 单向循环链表 同样单向循环链表也是要使用python来对 ...
- node 获取表单数据 为空_寻offer之JS数据结构与算法 -- 栈
栈 栈是一个线性结构,在计算机中是一种相当常见的数据结构. 栈与数组对比 我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据.但是有时候,我们为了实现某些功能,必须对这种任意性加以限制 ...
- node 获取表单数据 为空_Java实现数据结构之【链表】
链表相比于前几个章节讲的数据结构而言,是一个真正的动态数据结构也是一个最简单的动态数据结构,我们在后面还会接触更多的动态数据结构,所以对链表有一个理解非常好的基础,就能够更加容易的学习后面更加复杂的数 ...
- python获取表单数据的代码_使用flask和python从html表单获取表单数据
我正在尝试在按下submit时从文本字段中获取表单数据,以便将其放入json格式并作为另一个页面访问json数据,该页面将是localhost:5000/info.每次我试图用request.form ...
- 实验一 线性表的顺序存储与实现_程序员:数据结构与算法,线性表介绍
线性表 线性表(list):零个或多个数据元素的有限序列. 举个例子:一个班的小朋友,一个跟着一个排队,当中的每个小朋友都知道他前面的是谁,后面的是谁,如同一根线把他们串联起来.就可以称之为线性表. ...
- element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...
作者:凹凸实验室 链接:https://juejin.im/post/5ebb4346e51d451ef53793ad 整体思路 第一步是结合项目背景,调研比较优化的解决方案. 文件上传失败是老生常谈 ...
- mysql中decimal不能为空吗_程序员,知道Mysql中事务ACID的原理吗?
点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,A ...
最新文章
- 查看linux系统版本信息 lsb_release -a
- 变频电源要怎么测定额定容量
- python 调用linux命令-Python 调用系统命令
- 【科普】一图区分 IAAS + PAAS + SAAS
- MySQL的MyISAM和InnoDB存储引擎表结构
- 【Hibernate】Hibernate实体关系映射实例解析
- JavaScript中的数组和字符串
- 安德鲁斯Selector简介
- Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇
- (转)em重建全过程
- 【AI面试题】GBDT原理、如何用于分类、常用损失函数
- WINCE的KITL调试环境
- 关于Adobe AIR 获取屏幕信息及任务栏高度.
- 16、小程序OCR字体识别
- iOS 初中级工程师简历指南
- 国家认证的Python技术工程师有什么能力要求?
- Spark Stanalone HA_JZZ158_MBY
- 通信方面工作一些简单的名词解释整理
- 新架构、新场景、新范式之下 数字化转型的“懂行”驱动力
- 每日一题:1220. 统计元音字母序列的数目(Count Vowels Permutation)
热门文章
- UIElements开发人员指南9 样式(Style)和Unity样式表(style sheets)
- Keil下AStyle自动格式化代码
- win7家庭版升级成旗舰版
- 一个比较vista的vista主题for rf5.0fb(转)
- 一起脱去小程序的外套和内衣 - 微信小程序架构解析
- 算法与程序设计(二):递归
- 使用javamail发邮件出现javax.mail.MessagingException: Unknown SMTP host: smtp.qq.com的解决方案
- KEGGDrug数据库字段认识
- 【精彩回顾】迪拜BSV全球区块链大会Day3
- 现在连收银员也要考试了吗?