线索化二叉树

线索二叉树是在二叉树节点上添加线索,利用空链域存储节点的前驱和后继,便于遍历。二叉树的线索化分为前序、中序、后序三种,本文重点讲解中序线索化。通过示例展示了中序遍历后的二叉树如何线索化,解释了线索节点的左右指针可能指向子树或前后节点的情况,并提供了中序线索化二叉树的Java代码实现。
摘要由CSDN通过智能技术生成

一、线索二叉树概述

在二叉树的节点上加上线索的二叉树称为线索二叉树。对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。

通过考察各种二叉链表,不管二叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n 个节点的二叉链表共有 2n 个链域,其中非空链域为 n-1 个,但空链域却有 n+1 个。如下图所示,二叉树有 6 个节点,其中非空链域的个数为 7 个。

在这里插入图片描述

利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。

上图的二叉树的中序遍历结果是 {8, 3, 10, 1, 14, 6},但是 8, 10, 14, 6 这四个节点的左右指针并没有完全利用上。其实我们可以利用它们的左右指针,让各个节点可以指向自己的前后节点。如下图所示就是原二叉树线索化后生成的中序线索二叉树。

在这里插入图片描述

【注意】

当线索化二叉树后,节点的属性 leftright ,有如下情况:

  1. left 可能指向的是左子树,也可能是指向的前驱节点。比如 ① 节点的 left 指向的是左子树,而 ⑩ 节点的 left 指向的就是它的前驱节点;
  2. right 可能指向的是右子树,也可能是指向后继节点。比如 ① 节点的 right 指向的是右子树,而 ⑩ 节点的 right 指向的是它的后继节点。

二、线索化二叉树实现

中序线索化二叉树代码实现如下:

public class No3_ThreadedBinaryTree {
   

    public static void main(String[] args) {
   
        // 构造结点用于测试
        NumNode node_1 = new NumNode(1);
        NumNode node_2 = new NumNode(3);
        NumNode node_3 = new NumNode(6);
        NumNode node_4 = new NumNode
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值