二叉树前、中、后序线索化及遍历

public class ThreadedBinaryTree {
    public static void main(String[] args){
        Heronodes node1=new Heronodes(1,"李牧");
        Heronodes node2=new Heronodes(2,"萧炎");
        Heronodes node3=new Heronodes(3,"李太玄");
        Heronodes node4=new Heronodes(4,"周明瑞");
        Heronodes node5=new Heronodes(5,"克莱恩");
        Heronodes node6=new Heronodes(6,"老尼尔");
        Heronodes node7=new Heronodes(7,"邓恩");
        node1.setLeft(node2);
        node1.setRight(node3);
        node2.setParent(node1);
        node3.setParent(node1);

        node2.setLeft(node4);
        node2.setRight(node5);
        node4.setParent(node2);
        node5.setParent(node2);

        node3.setLeft(node6);
        node6.setParent(node3);
        node3.setRight(node7);
        node7.setParent(node3);

//        ThreadBinaryTree infixBinaryTree=new ThreadBinaryTree(node1);
//        infixBinaryTree.infixThreadBinaryTree(node1);
//        infixBinaryTree.infixList();

//        ThreadBinaryTree preBinaryTree=new ThreadBinaryTree(node1);
//        preBinaryTree.preTheadBinaryTree(node1);
//        preBinaryTree.preList();
//
        ThreadBinaryTree lastBinaryTree=new ThreadBinaryTree(node1);
        lastBinaryTree.lastThreadBinaryTree(node1);
        lastBinaryTree.lastList();
    }
}


class ThreadBinaryTree{
    private Heronodes root;
    private Heronodes pre=null;

    public ThreadBinaryTree(Heronodes root) {
        this.root = root;
    }

//    public void setEachParent(Heronodes node){//待定,给每一个标注出parentNode
//        Heronodes preNode=null;
//        if (node.getLeft()!=null){
//            preNode=node;
//            node=node.getLeft();
//            node.setParent(preNode);
//        }
//        setEachParent(node.getLeft());
//        if (node.getRight()!=null){
//            preNode=
//        }
//
//
//
//
//
//    }


    //中序线索化
    public void infixThreadBinaryTree(Heronodes node){
        if(node==null){
            return;
        }
        infixThreadBinaryTree(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=node;
        infixThreadBinaryTree(node.getRight());
    }

    //中序线索化的遍历
    public void infixList(){
        Heronodes node=root;
        while (node!=null){
            while (node.getLeftType()!=1){
                node=node.getLeft();
            }
            System.out.println(node);

            while (node.getRightType()==1){
                node=node.getRight();
                System.out.println(node);
            }
            node=node.getRight();

        }


    }

    //前序线索化
    public void preTheadBinaryTree(Heronodes node){
        if (node==null){
            return;
        }
        if(node.getLeft()==null){
            node.setLeft(pre);
            node.setLeftType(1);
        }

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

        }
        pre=node;

        if(node.getLeftType()!=1){
            preTheadBinaryTree(node.getLeft());
        }

        if (node.getRightType()!=1){
            preTheadBinaryTree(node.getRight());
        }


    }

    //前序线索化遍历
    public void preList(){
        Heronodes node =root;

        while (node!=null){
            while (node.getLeftType()!=1){
                System.out.println(node);
                node=node.getLeft();
            }
            System.out.println(node);
            node=node.getRight();
        }
    }

    //后序线索化
    public void lastThreadBinaryTree(Heronodes node){
        if (node==null){
            return;
        }
        lastThreadBinaryTree(node.getLeft());
        lastThreadBinaryTree(node.getRight());
        if (node.getLeft()==null){
            node.setLeft(pre);
            node.setLeftType(1);
        }

        if (pre!=null&&pre.getRight()==null){
            pre.setRight(node);
            pre.setRightType(1);
        }
        pre=node;
    }
    //遍历后序线索化二叉树
    public void lastList(){
        Heronodes node =root;
        while (node!=null&&node.getLeftType()!=1){
            node=node.getLeft();
        }
        Heronodes preNode=null;

        while (node!=null){
            if (node.getRightType()==1){
                System.out.println(node);
                preNode=node;
                node=node.getRight();
            }else {
                if (preNode==node.getRight()){
                    System.out.println(node);
                    if (node==root){
                        return;
                    }
                    preNode=node;
                    node=node.getParent();
                }else {
                    node=node.getRight();
                    while (node!=null&&node.getLeftType()!=1){
                        node=node.getLeft();
                    }
                }
            }
        }


    }

}





class Heronodes{
    private int number;
    private String name;
    private Heronodes left;
    private Heronodes right;
    private Heronodes parent;
    private  int leftType=0;//leftType=1时,代表前序,leftType=0时,代表左子树   初始情况下为0,后序线索化后将会改变

    private int rightType=0;//rightType=1时,代表后序,rightType=0时,代表右子树

    public Heronodes getParent() {
        return parent;
    }

    public void setParent(Heronodes parent) {
        this.parent = parent;
    }

    @Override
    public String toString() {
        return "Heronodes{" +
                "number=" + number +
                ", name='" + name + '\'' +
                '}';
    }

    public Heronodes(int number, String name) {
        this.number = number;
        this.name = name;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Heronodes getLeft() {
        return left;
    }

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

    public Heronodes getRight() {
        return right;
    }

    public void setRight(Heronodes 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;
    }
}

其实做下来就一个感觉,真难啊!自己智商根本不够用的感觉,但是诸位,还要坚持!

共勉!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值