1. 程式人生 > >Java版資料結構之線索二叉樹

Java版資料結構之線索二叉樹

簡介

  • 中序線索化二叉樹
  • 中序線索化遍歷

程式碼實現

public class MyThreadTree {

    int data;//結點權值
    
    MyThreadTree leftTree;//左子樹
    
    MyThreadTree rightTree;//右子樹
    
    int leftType;//左子樹型別 0:左子樹 1:前驅結點
    
    int rightType;//右子樹型別 0:右子樹 1:後繼結點

    MyThreadTree pre=null;//中序線索化前驅結點

    public MyThreadTree(int data) {
        this.data = data;
        leftType=0;
        rightType=0;
    }

    public void setLeftTree(MyThreadTree leftTree) {
        this.leftTree = leftTree;
    }

    public void setRightTree(MyThreadTree rightTree) {
        this.rightTree = rightTree;
    }

    //中序遍歷
    public void middleShow(){
        if(this==null){
            return;
        }
        //左子樹
        if(this.leftTree!=null){
            this.leftTree.middleShow();
        }
        //根
        System.out.println(this.data);
        //右子樹
        if(this.rightTree!=null){
            this.rightTree.middleShow();
        }
    }

    //中序線索化二叉樹
    public void middleThreadTree(MyThreadTree node){
        if(node==null){
            return;
        }
        //左子樹
        if(node.leftTree!=null){
            middleThreadTree(node.leftTree);
        }
        //根
        if(node.leftTree==null){
            node.leftTree=pre;
            node.leftType=1;
        }
        if(pre!=null&&pre.rightTree==null){
            pre.rightTree=node;
            pre.rightType=1;
        }
        pre=node;
        //右子樹
        if(node.rightTree!=null){
            middleThreadTree(node.rightTree);
        }
    }

    //中序線索化遍歷
    public void middleThreadShow(){
        if(this==null){
            return;
        }
        MyThreadTree root=this;
        while (root!=null){
            //左子樹
            while(root.leftType==0){
                root=root.leftTree;
            }
            //列印當前結點的值
            System.out.println(root.data);
            //右子樹
            while(root.rightType==1){
                root=root.rightTree;
                System.out.println(root.data);
            }
            //當結點有右子樹時
            root=root.rightTree;
        }
    }
}