线索化二叉树及其遍历

本文介绍了线索化二叉树的概念,重点解析了中序线索化的代码实现和遍历过程,并提供了完整的包括前序和中序线索化及遍历的方法。通过线索化,可以在二叉链表中快速找到结点的前驱和后继,便于遍历操作。
摘要由CSDN通过智能技术生成

1.概念

n个结点的二叉链表中含有n+1个空指针域。
利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")
在这里插入图片描述
例如为10的这个节点,它的前驱节点为3,后继节点为1.

2.中序线索化代码

public class Main {
   
    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.left = node2;
        root.right = node3;
        node2.left = node4;
        node2.right = node5;
        node3.left = node6;

        System.out.println("线索化之前 id为10的left为:"+ node5.left + " right为:"+ node5.right);
        ThreadedBinaryTree threadedBinaryTree = new ThreadedBinaryTree(root);
        threadedBinaryTree.threadedNodes(root);

        System.out.println("线索化之后 id为10的left为:"+ node5.left + " right为:"+ node5.right);
    }



}
class ThreadedBinaryTree{
   
    HeroNode root;
    HeroNode preCurNode = null;//指向当前节点的前一个节点

    public ThreadedBinaryTree(HeroNode root) {
   
        this.root = root;
    }

    //中序线索化二叉树
    public void threadedNodes(HeroNode curNode){
   
        if (curNode == null){
   
            //System.out.println("当前节点为null  无法线索化");
            return;
        }

        //先向左递归
        threadedNodes(curNode.left);

        //然后对当前节点进行线索化
        //对当前节点的左指针进行线索化
        if (curNode.left == null){
   
            curNode.left = preCurNode;
            curNode.HERO_NODE_TYPE_LEFT = 1;//说明左指针指向了前驱节点
        }

        //对右指针的线索化是下一轮进行的
        if (preCurNode != null && preCurNode.right == null){
   
            preCurNode.right = curNode;
            preCurNode.HERO_NODE_TYPE_RIGHT = 1;
        }

        preCurNode = curNode;

        //最后向右递归
        threadedNodes(curNode.right);
    }

}
//树的每个节点
class HeroNode{
   
    int id;
    String name;
    HeroNode left;
    HeroNode right;
    //节点指针类型
    //如果值为1说明节点左 或者 右指针指向的是前驱 或者 后继节点
    //如果值为0说明节点左 或者 右指针指向的是左 或者 右子树
    int HERO_NODE_TYPE_LEFT = 0;
    int HERO_NODE_TYPE_RIGHT = 0;


    public HeroNode(int id, String name) {
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值