10.5 线索化二叉树

目录

概念

​代码实现


概念

代码实现

package Part10.Threaded;

public class threadedBinaryTree {
    public static void main(String[] args) {
        //创建二叉树
        //创建结点
       //插入节点到二叉树
       
    //线索化二叉树
        //binaryTree.perThreadedNode(root);
        //binaryTree.centerThreadedNode(root);
        //binaryTree.finalThreadedNode(root);

        System.out.println(node3.getLeft());
    }
}

class BinaryTree{
    private HeroPoint root;
    //  线索化的前节点
    private HeroPoint per;

    public void perThreadedNode(HeroPoint node){
        if(node == null){
            return;
        }

        if(node.getLeft() == null){
            node.setLeft(per);
            node.setLeftType(1);
        }

        if(per != null && per.getRight() != null){
            per.setRight(node);
            per.setRightType(1);
        }

        per = node;

        if(node.getLeftType() == 0){
            perThreadedNode(node.getLeft());
        }
        if (node.getRightType() == 0) {
            perThreadedNode(node.getRight());
        }
    }

    public void centerThreadedNode(HeroPoint heroPoint){

        if(heroPoint == null){
            return;
        }

        //  先左遍历找完所有的左子树
        centerThreadedNode(heroPoint.getLeft());

        // 建立联系
        if(heroPoint.getLeft() == null){
            heroPoint.setLeft(per);
            heroPoint.setLeftType(1);
        }

        if(per != null && per.getRight() != null){
            per.setRight(heroPoint);
            per.setRightType(1);
        }

        per = heroPoint; // 保存用于下一节点的使用

        // 查找右子树
        centerThreadedNode(heroPoint.getRight());
    }

    public void finalThreadedNode(HeroPoint heroPoint){

        if(heroPoint == null){
            return;
        }

        //  左遍历找完所有的左子树
        finalThreadedNode(heroPoint.getLeft());

        // 查找右子树
        finalThreadedNode(heroPoint.getRight());

        // 建立联系
        if(heroPoint.getLeft() == null){
            heroPoint.setLeft(per);
            heroPoint.setLeftType(1);
        }

        if(per != null && per.getRight() != null){
            per.setRight(heroPoint);
            per.setRightType(1);
        }

        per = heroPoint;
    }
}

class HeroPoint{

    private int id;
    private String name;

    private HeroPoint left;
    private HeroPoint right;

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值