Java数据结构《二叉树》中序线索化,遍历

package tree;

public class ThreadedBinaryTreeDemo {
    public static void main(String[] args) {
        HeroNode2 root = new HeroNode2(1,"宋江");
        HeroNode2 node1 = new HeroNode2(3,"吴用");
        HeroNode2 node2 = new HeroNode2(6,"卢俊义");
        HeroNode2 node3 = new HeroNode2(8,"武松");
        HeroNode2 node4 = new HeroNode2(10,"鲁智深");
        HeroNode2 node5 = new HeroNode2(14,"花荣");
        //手动生成树
        root.setLeft(node1);
        root.setRight(node2);
        node1.setLeft(node3);
        node1.setRight(node4);
        node2.setLeft(node5);
        ThreadedBinaryTree tree = new ThreadedBinaryTree();
        tree.setRoot(root);
        tree.thread();
        System.out.println(node3.getLeft());
        System.out.println(node3.getLeftType());
        System.out.println(node3.getRight());
        System.out.println(node3.getRightType());
        System.out.println(node2.getLeft());
        System.out.println(node2.getLeftType());
        System.out.println(node2.getRight());
        System.out.println(node2.getRightType());
        tree.threadedList();

    }
}
class ThreadedBinaryTree{
    private HeroNode2 root;
    private HeroNode2 pre = null;//记录当前节点的前一个节点

    public void setRoot(HeroNode2 root) {
        this.root = root;
    }
    public void thread(){
        thread(root);
    }
    //线索化是将原本没有指向的节点添加节点信息
    public void thread(HeroNode2 node){
        if (node == null) {
            return;
        }
        if (node.getLeft() != null) {
            thread(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后移
        pre = node;
        if(node.getRight() != null){
            thread(node.getRight());
        }
    }
    public void threadedList(){
        HeroNode2 node = root;
        while (node != null){
            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();
        }
    }
}
class HeroNode2{
    private int no;
    private String name;
    private HeroNode2 left;
    private HeroNode2 right;
    private int leftType;
    private int rightType;

    public HeroNode2(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 HeroNode2 getLeft() {
        return left;
    }

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

    public HeroNode2 getRight() {
        return right;
    }

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

    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;
    }

    @Override
    public String toString() {
        return "HeroNode2{" +
                "no=" + no +
                ", name='" + name + '\'' +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值