线索化二叉树

线索化二叉树

思路

这里我们使用中根递归的方法实现对二叉树的线索化,步骤如下:
    1.线索化当前结点的左子树
    2.对当前结点进行操作(重点)
        ①如果当前结点左子树为空的话,将左引用指向当前节点的上一个结点(我们用一个变量来保存上一次执行操作的结点);
        ②如果上一个结点的右子树为空的话,将上一个结点的右引用置为当前结点。(当前操作我们是在为上一次的结点的有引用复制)。
    3.线索化当前结点的右子树

代码实现(Java)

结点类定义:

public class Node {
    private int id;
    private Node left;
    private Node right;

    //  线索化二叉树需要的属性,为false时指向子结点,为true时指向前驱或后继结点
    private boolean leftTag;
    private boolean rightTag;
}

线索化二叉树的实现方法如下:

    //  线索二叉树里指向当前结点的前一个结点
    private static Node pre = null;
    public static void threadedTree(Node node) {
        if (node == null) {
            return;
        }
        //  指向当前结点
        Node temp = node;
        //  中根顺序线索化左子树
        threadedTree(temp.getLeft());
        //  为当前结点线索化
        //  当前结点左孩子结点为空,让其指向前驱节点
        if (temp.getLeft() == null) {
            temp.setLeft(pre);
            temp.setLeftTag(true);
        }
        //  当前结点的后继结点其实是通过下一次的前驱节点来设置的
        //  本次设置的是上一次的后继节点
        if (pre != null && pre.getRight() == null) {
            pre.setRight(temp);
            pre.setRightTag(true);
        }
        //  操作完当前结点后,让pre移动到temp位置
        pre = temp;
        //  中根顺序线索化右子树
        threadedTree(temp.getRight());
    }

更多算法知识请关注微信公众号:青云学斋
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值