线索化二叉树

数据结构学习笔记——线索二叉树 # 一、线索二叉树的结点结构 > 在由n个结点组成的二叉链表中,含有n+1个空指针域,含有n-1个非空指针域。 如前面文章介绍的,含有n个结点的二叉树中,有n+1个空指针,对于叶子结点,它有两个空指针;对于度为1的结点(只有一个子结点),它只有一个空指针。将这些空指针利用起来,例如可以让其存放指向该结点的前驱或后驱,从而使遍历二叉树更加简便,即`线索二叉树`。 如下图,由中序遍历序列(DBEAFCG)可以推出,其中结点D和结点G的中序前驱和中序后继为NULL:............ 阅读详情

基本概念

  • n个结点的二叉链表中含有n+1【公式2n-(n-1)=n+1】个空指针域。利用二又链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为“线索")
  • 这种加上了线索的二又链表称为线索链表,相应的二又树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二又树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种
  • 一个结点的前干个结点,称为前驱结点
  • 一个结点的后一个结点,称为后继结点

思路图解

将下面的二叉树,进行中序线索二叉树。中序遍历的数列为{8,3,10,1,14,6}
在这里插入图片描述
线索化之后:
在这里插入图片描述说明:当线索化二叉树后,Node节点的属性left和right,有如下情况:

  • left有间的是左子树,也可能是指问的前驱节点,比如①节点left指向的左子树,而⑩节点的left指向的就是前驱节点.
  • right指向的是右子树,也可能是指向后继节点,比如①节点right指向的是右子树,而⑩节点的right指向的是后继节点.

遍历线索化二叉树

说明:对前面的中序线索化的二又树,进行遍历
分析:因为线索化后,各个结点指向有变化,因此原来的遍历方式不能使用,这时需要使用新的方式遍历线索化二叉树,各个节点可以通过线型方式遍历,因此无需使用递归方式,这样也提高了遍历的效率。遍历的次序应当和中序遍历保持一致。

代码实现

package com.tree.threadedbinary;

public class ThreadedBinaryTreeDemo {

	public static void main(String[] args) {
		// 测试一把中序遍历
		HeroNode root = new HeroNode(1, "tom");
		HeroNode node2 = new HeroNode(3, "jack");
		HeroNode node3 = new HeroNode(6, "smith");
		HeroNode node4 = new HeroNode(8, "mary");
		HeroNode node5 = new HeroNode(10, "king");
		HeroNode node6 = new HeroNode(14, "dim");

		// 二叉树递归创建
		root.setLeft(node2);
		root.setRight(node3);
		node2.setLeft(node4);
		node2.setRight(node5);
		node3.setLeft(node6);

		// 测试线索化
		ThreadedBinaryTree threadedBinaryTree = new ThreadedBinaryTree();
		threadedBinaryTree.setRoot(root);
		threadedBinaryTree.threadedNodes();

		// 测试
		HeroNode leftNode = node5.getLeft();
		HeroNode rightNode = node5.getRight();
		System.out.println("10号的前驱结点" + leftNode);
		System.out.println("10号的后继结点" + rightNode);

		// 当线索化二叉树后,不能再使用原来的遍历方法
		// threadedBinaryTree.infixOrder();

		System.out.println("使用线索化的方法遍历线索化二叉树");
		threadedBinaryTree.threadedList();

	}

}

// 定义ThreadedBinaryTree 线索化二叉树
/**
 *
 * @ClassName:ThreadedBinaryTree
 *
 * @Description:TODO 定义ThreadedBinaryTree 线索化二叉树
 *
 * @date:2020年1月4日
 *
 */
class ThreadedBinaryTree {
	private HeroNode root;

	// 为了实现线索化,需要创建要给指向当前结点的前驱结点的指针
	// 在递归进行线索化时,pre总是保留前一个结点
	private HeroNode pre = null;

	public void setRoot(HeroNode root) {
		this.root = root;
	}

	// 重载threadedNodes
	public void threadedNodes() {
		this.threadedNodes(root);
	}

	/**
	 * @Method_Name:threadedList
	 * @Description: 中序遍历线索化二叉树的方法
	 */
	public void threadedList() {
		// 定义一个变量,存储当前遍历的结点,从root开始
		HeroNode node = root;
		while (node != null) {
			// 循环的找到leftType==1的结点,第一个找到就是8结点
			// 后面随着遍历而变化,因为当leftType==1时,说明该结点是按照线索化
			// 处理后的有效结点
			while (node.getLeftType() == 0) {
				node = node.getLeft();
			}
			// 打印当前节点
			System.out.println(node);
			// 如果当前节点的右指针指向的是后继结点,就一直输出
			while (node.getRightType() == 1) {
				// 获取当前节点的后继结点
				node = node.getRight();
				System.out.println(node);
			}
			// 替换这个遍历的结点
			node = node.getRight();

		}

	}

	/**
	 * @Method_Name:threadedNodes
	 * @Description: 编写中序线索化的方法
	 * @param node void 当前需要线索化的结点
	 */
	public void threadedNodes(HeroNode node) {
		// 如果node==null不能线索化
		if (node == null) {
			return;
		}
		// (一)先线素化左子树
		threadedNodes(node.getLeft());

		// (二)线索化当前结点[有难度]
		// 处理当前节点的前驱结点
		if (node.getLeft() == null) {
			// 让当前节点的左指针指向前驱结点
			node.setLeft(pre);
			// 修改当前接地点左指针的类型,指向前驱结点
			node.setLeftType(1);
		}
		// 处理后继结点
		if (pre != null && pre.getRight() == null) {
			// 让前驱结点的右指针指向当前节点
			pre.setRight(node);
			// 修改前驱结点的右指针类型
			pre.setRightType(1);
		}
		// 每处理一个结点后,让当前节点是下一个节点的前驱结点
		pre = node;

		// (三)在线索化右子树
		threadedNodes(node.getRight());

	}

	// 删除结点
	public void delNode(int no) {
		if (root != null) {
			// 如果只有一个root结点,立即判断root是不是要删除的结点
			if (root.getNo() == no) {
				root = null;
			} else {
				// 递归删除
				root.delNode(no);
			}
		} else {
			System.out.println("空树,不能删除");
		}
	}

	// 前序遍历
	public void preOrder() {
		if (this.root != null) {
			this.root.preOrder();
		} else {
			System.out.println("二叉树为空");
		}
	}

	// 中序遍历
	public void infixOrder() {
		if (this.root != null) {
			this.root.infixOrder();
		} else {
			System.out.println("二叉树为空");
		}
	}

	// 后序遍历
	public void postOrder() {
		if (this.root != null) {
			this.root.postOrder();
		} else {
			System.out.println("二叉树为空");
		}
	}

	// 前序遍历
	public HeroNode preOrderSearch(int no) {
		if (root != null) {
			return root.preOrderSearch(no);
		} else {
			return null;
		}
	}

	// 中序遍历
	public HeroNode infixOrderSearch(int no) {
		if (root != null) {
			return root.infixOrderSearch(no);
		} else {
			return null;
		}
	}

	// 后序遍历
	public HeroNode postOrderSearch(int no) {
		if (root != null) {
			return root.postOrderSearch(no);
		} else {
			return null;
		}
	}
}

// 创建HerNode结点
class HeroNode {
	private int no;
	private String name;
	private HeroNode left;// 默认为空
	private HeroNode right;// 默认为空

	// 如果leftType==0表示指向左子树,如果是1表示指向前驱结点
	// 如果rightType==0表示指向右子树,如果是1表示指向后继结点
	private int leftType;
	private int rightType;

	public int getLeftType() {
		return leftType;
	}

	public void setLeftType(int leftType) {
		this.leftType = leftType;
	}

	public int getRightType() {
		return rightType;
	}

	public void setRightType(int rightType) {
		this.rightType = rightType;
	}

	public HeroNode(int no, String name) {
		this.no = no;
		this.name = name;
	}

	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public HeroNode getLeft() {
		return left;
	}

	public void setLeft(HeroNode left) {
		this.left = left;
	}

	public HeroNode getRight() {
		return right;
	}

	public void setRight(HeroNode right) {
		this.right = right;
	}

	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + "]";
	}

	// 递归删除结点
	// 1. 如果删除的结点是叶子节点,则删除该节点
	// 2. 如果删除的结点是非叶子节点,则删除该子树
	public void delNode(int no) {
		// 思路:
		// 1. 因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点
		// 2. 如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除)
		// 3. 如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
		// 4. 如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除
		// 5. 如果第4步也没有删除结点,则应当向右子树进行递归删除。
		// 6. 如果考虑树是空树root,如果只有一个root结点,则等价将二叉树置空

		// 2. 如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除)
		if (this.left != null && this.left.no == no) {
			this.left = null;
			return;
		}
		// 3. 如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
		if (this.right != null && this.right.no == no) {
			this.right = null;
			return;
		}
		// 4.先左子树进行递归删除
		if (this.left != null) {
			this.left.delNode(no);
			// return
		}
		// 5.向右子树递归删除
		if (this.right != null) {
			this.right.delNode(no);
		}
	}

	// 前序遍历
	public void preOrder() {
		System.out.println(this);// 输出父节点
		// 递归向左子树先序遍历
		if (this.left != null) {
			this.left.preOrder();
		}
		// 递归向右子树先序遍历
		if (this.right != null) {
			this.right.preOrder();
		}
	}
	// 中序遍历
	public void infixOrder() {
		// 递归向左子树中序遍历
		if (this.left != null) {
			this.left.infixOrder();
		}
		// 输出父节点
		System.out.println(this);
		// 递归向右子树中序遍历
		if (this.right != null) {
			this.right.infixOrder();
		}
	}

	// 后序遍历
	public void postOrder() {
		// 递归向左子树中序遍历
		if (this.left != null) {
			this.left.postOrder();
		}
		// 递归向右子树中序遍历
		if (this.right != null) {
			this.right.postOrder();
		}
		// 输出父节点
		System.out.println(this);
	}

	// 前序遍历查找
	/**
	 * @param no 查找no
	 * @return 找到返回Node 没有找到返回null
	 */
	public HeroNode preOrderSearch(int no) {
		System.out.println("进入前序遍历");
		// 比较当前节点是不是
		if (this.no == no) {
			return this;
		}
		// 判断当前节点的左子节点是否为空,不为空递归前序查找
		// 如果左递归找到就返回
		HeroNode resNode = null;
		if (this.left != null) {
			resNode = this.left.preOrderSearch(no);
		}
		if (resNode != null) {// 说明左子树找到
			return resNode;
		}
		// 左递归没有找到,继续判断。
		// 右子节点是否为空? 不为空继续右递归前序查找
		if (this.right != null) {
			resNode = this.right.preOrderSearch(no);
		}
		return resNode;
	}

	// 中序遍历查找
	public HeroNode infixOrderSearch(int no) {
		// 判断当前节点的左子节点是否为空,不为空则递归中序查找
		HeroNode resNode = null;
		if (this.left != null) {
			resNode = this.left.infixOrderSearch(no);
		}
		if (resNode != null) {
			return resNode;
		}
		System.out.println("进入中序遍历");
		// 如果找到,返回;没有找到就和当前节点比较,如果是就返回当前节点
		if (this.no == no) {
			return this;
		}
		// 否则继续右递归进行中序查找
		if (this.right != null) {
			resNode = this.right.infixOrderSearch(no);
		}
		return resNode;

	}

	// 后序遍历查找
	public HeroNode postOrderSearch(int no) {
		// 判断当前节点的左子节点是否为空。不为空则递归后序查找
		HeroNode resNode = null;
		if (this.left != null) {
			resNode = this.left.postOrderSearch(no);
		}
		if (resNode != null) {
			return resNode;
		}
		// 如果左子树的都没有找到,向右子树查找
		if (this.right != null) {
			resNode = this.right.postOrderSearch(no);
		}
		if (resNode != null) {
			return resNode;
		}
		System.out.println("进入后序查找");
		if (this.no == no) {
			return this;
		}
		return resNode;
	}
}
线索化二叉树(线索化二叉树遍历方法,倒序线索化二叉树遍历结果) 本篇介绍线索化二叉树、线索化后的中序遍历以及反向输出中序遍历。 注:(不管是前序遍历、中序遍历或者后序遍历,道理都是一样的,只不过顺序不一样,所以本篇的就拿中序遍历作为讲解,方便统一与理解) 文章目录1.线索化二叉树1.1-什么是线索化二叉树1.2-线索化二叉树的意义1.3-线索化二叉树完整代码2.线索化后的中序遍历2.1-思路2.2-完整代码3.(拓展)利用线索化后的二叉树反向输出中序遍历3.1-思路3.2-完整代码 1.线索化二叉树 1.1-什么是线索化二叉树 首先思考一下:我们知道,不管是二叉树的前序 阅读详情

相关推荐

【c++】二叉树的线索化

什么是二叉树的线索化?或者问什么是线索二叉树? 按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列。在改序列中,除第一个结点外每个结点有且仅有一个直接前驱结点;除最后一个结点外每一个结点有且仅有一个直接后继结点。这些指向直接前驱结点和指向直接后续结点的指针被称为线索(Thread),加了线索的二叉树称为线索二叉树。 以上是搜狗百科的一段文字,反正我是没看太懂。简单点

LLZK_的博客 4346

数据结构 | 证明:含有n个结点的二叉链表中共有n+1个空链域

方法一: 含有n个结点的二叉链表中,链域一共有2*n个(每个点有两个链域)。 对于除了根结点以外的每个点都是有一个父亲结点,所以一共有n-1个指针指向某个结点, 于是形成n-1个有内容的链域(减1即是父亲结点)所以一共有2*n-(n-1)=n+1个链域没有指向任何东西。 方法二: 二叉树中:结点数n=n1+n2+n0,(n0是度数为0的结点,也称叶子结点;n1是度数为1的结点;n2是度数为2的结点) 设空链域个数为N,N=n1+2*n0,(因为度数为1的有一个空,度数为0的有两个为空) 因为n

"You are worthy! You can do it!" 5281

从数据校准到论文呈现:fsQCA与NCA方法融合的完整实证研究指南

本文详细介绍了fsQCA(模糊集定性比较分析)与NCA(必要条件分析)方法融合的完整实证研究流程,从数据校准到论文呈现。通过软件操作技巧、R语言NCA包高效使用及论文写作规范,帮助研究者避免常见误区,提升研究质量与可靠性。特别适合需要进行组态分析的研究生和学者参考。

weixin_29215391的博客 414

线索二叉树

线索二叉树的结点结构 如果在二叉树中想保存每个结点前趋和后继所在的位置信息,最直接的想法就是改变结点的结构,即添加两个指针域,分别指向该结点的前趋和后继。 但是这种方式会降低树存储结构的存储密度。而对于二叉树来讲,其本身还有很多未利用的空间。 存储密度指的是数据本身所占的存储空间和整个结点结构所占的存储量之比。 每一棵二叉树上,很多结点都含有未使用的指向NULL的指针域。除了度为2的结点,度为 1 的结点,有一个空的指针域;叶子结点两个指针域都为NULL。 规律:在有 n 个结点的二叉链表中必定存在 n+1

weixin_43732535的博客 982

从零构建2.4G无线通信系统:MSPM0G3507与NRF24L01的深度协同设计

本文详细介绍了基于MSPM0G3507微控制器与NRF24L01射频模块构建2.4G无线通信系统的深度协同设计方案。内容涵盖系统架构、SPI通信优化、功耗管理、抗干扰机制及中断/DMA高效利用,为工业物联网应用提供高可靠、低功耗的无线传输解决方案。

rice5的博客 819

3D高斯溅射融合Gabor滤波器:频率感知如何提升神经渲染效率与质量

在计算机视觉与图形学领域,3D场景重建旨在从多视角图像中恢复真实世界的三维结构与外观。其核心原理是通过优化场景表示,使渲染出的二维图像与输入照片尽可能一致。传统方法在效率与细节保真度间常面临权衡,高频细节(如精细纹理、锐利边缘)的重建尤为消耗算力。频率感知技术为此提供了突破方向,它借鉴信号处理思想,将场景分解为不同空间频率的成分进行针对性建模。Gabor滤波器作为经典的频率-方向分析工具,能有效刻画纹理的局部频域特征。将Gabor的频率选择性与3D高斯溅射(3DGS)这一高效显式表示结合,构成了神经Gabo

weixin_33087827的博客 272

数据结构:证明:含有n个结点的二叉链表中含有n+1个空链域

二叉树的链表表示有两种存储结构 :二叉链表和三叉链表 对于二叉链表,结点有左子树、右子树时,对应的指针域才不会为空。 1、n个节点有2n个指针域 2、n个节点中有n-1条边(除了头结点没有边,其余节点都有一个父节点,相当于都有1条边,共n-1条) 3、空链域就是2n-(n-1)=n+1 ...

Mmyine的博客 6299

STM32F407控制舵机

STM32F407控制舵机运行 使用STM32F407控制舵机,首先来看下舵机图片 [黑红白,黑线接GND,红线接VCC,信号线接白色线(有的舵机线的颜色不同,例如褐色红色橘色,仅颜色不同接法还如上述)] 舵机需要信号的周期为20ms,即频率为50Hz。 接下来正式操作: 步骤一:STM32F4程序(本次程序的PWM信号产生的周期频率由定时器TIM14通道1产生(TIM14_CH1),想要使用其它定时器也没关系下面会讲到) #include "pwm.h" void TIM14_CH1_PWM_In

Ievn_Hare的博客 1万+

刷题笔记(链表)-12

文章目录环形链表合并两个有序链表反转字符串 环形链表 题目地址:141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com) 思路:递归 利用Set去重的特点,添加节点,如果节点重复,返回True 递归直到结束 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { *

康小庄的博客 355

从零开始构建AURIX TC397开发环境:硬件选型与IDE配置全攻略

本文详细介绍了如何从零开始构建AURIX TC397开发环境,涵盖硬件选型、IDE配置及外设驱动开发等关键步骤。针对TriCore架构的高性能特性,提供了开发板选型建议、AURIX Development Studio(ADS)安装配置指南,以及GPIO和CAN FD驱动的实战代码示例,帮助开发者快速上手TC397系列微控制器的开发工作。

7up55的博客 203

Google Earth Engine ——在 GEE 中计算面积含各类要素计算(土地分类为例)

在遥感应用中工作时,许多操作需要计算面积。例如,需要在监督分类后计算每个类所覆盖的面积,或者找出灾害后区域内受影响的面积。计算栅格和矢量的面积在大多数软件包中是一个简单的操作,但在 Google Earth Engine 中以稍微不同的方式完成 - 这可能会让初学者感到困惑。在这篇文章中,我将概述计算矢量和图像面积的方法。我们将涵盖以下主题,从简单到复杂。 特征的面积计算,即矢量数据 图像的面积计算(单类) 按类别计算图像的面积 按区域按类别计算图像的面积 按年按地区按类别计算图像的面积 准备数据

此星光明博客 4024

Python实现线索化二叉树 Python实现线索化存储二叉树 Python线索化二叉树的遍历

Python实现线索化二叉树 Python实现线索化存储二叉树 Python线索化二叉树的遍历

storyfull 3287

SerDes电路的PCB仿真设计规则及策略

SerDes的PCB设计中,重点工作是使用3D 电磁 (EM) 场求解器,进行过孔结构优化,包括 BGA的扇入和扇出区域以及布线的过孔区域,并且,利用连接器供应商提供加密的 3D 模型,进行连接器和 PCB 的级联仿真,最终获取系统级的通道性能参数,如插入损耗、回波损耗、串扰和模式转换、阻抗曲线等,如果发现任何缺陷,再进行进一步优化,这一过程中,推荐进行拆分仿真,以提高设计效率。

一只豌豆象的博客 2190

中序线索化二叉树

为什么要线索化二叉树? 答:对于如下一颗二叉树,中序遍历二叉树结果为4,2,5,1,3那么我想知道5前面的数是什么,就必须要先中序遍历一遍然后再去查询5前面的数字。那么如果我这样操作:对于左右子节点为null的节点,它的左节点指向前一个节点,右节点指向下一个节点,同时标记指针置为1,这样的话,我就可以直接知道中序遍历时5的前一个节点和后一个节点。 这个对二叉树的操作过程叫:线索化二叉...

小飞的博客 7831

【2024/3/12 更新】Windows Server 2019 服务配置与管理汇总

本栏目一共介绍了17种Windows Server 2019 的服务配置与管理,为了方便大家阅读理解,特意总结了17种服务的一些内容。具体说明如下所示

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 2万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

线索化二叉树(先序,中序,后序)+线索化二叉树的遍历【java详解】

n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种一个结点的前一个结点,称为前驱结点一个结点的后一个结点,称为后继结点//线索化时记录前一个节点//节点存储结构。

2302_79862386的博客 3231

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【算法系列之线索化二叉树,前序线索化、中序线索化、后序线索化以及遍历~】

1.何谓线索化二叉树2.线索化二叉树的本质3.线索化二叉树的存储结构4.构建线索化二叉树4.1.先序线索化4.2.中序线索化4.3.后序线索化5.遍历线索化二叉树5.1.先序遍历 先序线索化二叉树5.2.中序遍历 中序线索化二叉树5.3.后序遍历 后序线索化二叉树6.线索化二叉树的优势与劣势 1.何谓线索化二叉树 ????‍☠️一般的二叉树的叶子节点的指针都造成了浪费,对于有n个节点的二叉树,其中就有n+1个空链域;所以我们可以将空链域存放某种遍历次序下该节点的前驱节点和后继节点,这些指针被成为线索,

Kevinnsm的博客 7087

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

线索化二叉树(前序线索化,中序线索化)

为什么要对二叉树进行线索化? 对二叉树进行遍历是以一定的规则将二叉树的节点排列成一个线性序列,这些线性序列有且仅有一个直接前驱和直接后继,但是以二叉链表进行存储的时候,只能找到节点的左右孩子信息,不能直接得到节点在任一序列的前驱和后继信息,前驱和后继信息只能在遍历的动态过程中才能得到。 如何获取到前驱和后继的信息呢? 在有n个节点的二叉链表中必定存在n+1个空链域,利用这些空链域存放节点的前

静陌慕春 3万+

线索化二叉树以及遍历线索化二叉树

线索化二叉树以及遍历线索化二叉树 1.线索二叉树基本介绍 n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索") 这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种 一个结点的前一个结点,称为前驱结点 一个结点的后一个结点,称为

xiaoshiguang3的博客 478

中序线索化二叉树及遍历

中序线索化二叉树及遍历。 函数接口定义: void InThreading(BiThrTree p);// 以结点P为根的子树中序线索化 void InOrderTraverse_Thr(BiThrTree T);// 中序遍历二叉线索树T的非递归算法,对每个数据元素直接输出 裁判测试程序样例: #include<iostream> using namespace std; type...

zaiyang遇见 9088

二叉树的线索化

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

snow_5288的博客 3214

前序线索化二叉树

前序化二叉树的方法 其实这里的重点就是设置一个变量来记录当前节点的上一个节点,然后再进行处理,重中之重就是画图!!! 还有就是要明白递归是什么,递归式回溯!!! 在上一篇文章中已经讲过线索化二叉树和中序线索化二叉树的方法 现在在这里再讲一下前序线索化二叉树以及遍历前序线索化二叉树的方法 /** * 前序线索化二叉树 * @param node */ void preThreadOrder(HeroNode node) { if(node == null)

来杯咖啡吗的博客 1377
上一篇: 顺序存储二叉树
下一篇: 堆排序
lu_long
博客等级 码龄8年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值