线索二叉树(java)

1.根据前序创建二叉树

2.线索化

3.中序遍历

import java.util.Scanner;

enum PointterTag{
    Link,Thread;
}

class BiThrNode{
    char data;
    BiThrNode lchild,rchild;
    PointterTag LTag=PointterTag.Link,RTag=PointterTag.Link;
}

public class Main{
    static char[] chs;
    static int index;
    static BiThrNode pre=new BiThrNode();
    
    static BiThrNode createTree() {
        if(chs[index]==' ') {
            index++;
            return null;
        }
        BiThrNode root=new BiThrNode();
        root.data=chs[index++];
        root.lchild=createTree();
        root.rchild=createTree();
        return root;
    }
    
    static void inOrderThreading(BiThrNode Thrt,BiThrNode T) {
        Thrt.LTag=PointterTag.Link;
        Thrt.RTag=PointterTag.Thread;
        Thrt.rchild=Thrt;
        
        if(T==null)Thrt.lchild=Thrt;
        else {
            Thrt.lchild=T;pre=Thrt;
            inThreading(T);
            pre.RTag=PointterTag.Thread;
            pre.rchild=Thrt;
            Thrt.rchild=pre;
        }
    }
    
    static void inThreading(BiThrNode p) {
        if(p!=null) {
            inThreading(p.lchild);
            if(p.lchild==null) {p.LTag=PointterTag.Thread;p.lchild=pre;}
            if(pre.rchild==null) {pre.RTag=PointterTag.Thread;pre.rchild=p;}
            pre=p;
            inThreading(p.rchild);
        }
    }
    
    static void inOrderTravels(BiThrNode Thrt) {
        BiThrNode p=Thrt.lchild;
        while(p!=Thrt) {
            while(p.LTag==PointterTag.Link)p=p.lchild;
            System.out.print(p.data+" ");//visit;
            while(p.RTag==PointterTag.Thread&&p.rchild!=Thrt) {
                p=p.rchild;
                System.out.print(p.data+" ");
            }
            p=p.rchild;
        }
    }
    
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        BiThrNode Thrt =new BiThrNode();
        BiThrNode T;
        
        chs=sc.nextLine().toCharArray();
        T=createTree();
        inOrderThreading(Thrt, T);
        inOrderTravels(Thrt);
    }
}

 

posted @ 2021-03-11 16:58  金龙喩  阅读(60)  评论(0)    收藏  举报