完整代码实例: Java实现中序线索化二叉树,以及对其的中序遍历

结点类的实现

package DataStrcture.binarytreedemo_1;

public class BinaryTreeNodeThread_copy {
    //
    private BinaryTreeNodeThread_copy leftNode;
    private BinaryTreeNodeThread_copy rightNode;
    private int leftNodeType;
    private int rightNodeType;
    private int id;
    private String name;

    //设置左右孩子结点
    public void setLeftNode(BinaryTreeNodeThread_copy node){
        this.leftNode = node;
    }
    public void setRightNode(BinaryTreeNodeThread_copy node){
        this.rightNode = node;
    }
    //get set 构造方法, toString()

    public BinaryTreeNodeThread_copy(int id, String name) {
        this.id = id;
        this.name = name;
    }

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

    public BinaryTreeNodeThread_copy getLeftNode() {
        return leftNode;
    }

    public BinaryTreeNodeThread_copy getRightNode() {
        return rightNode;
    }

    public int getLeftNodeType() {
        return leftNodeType;
    }

    public void setLeftNodeType(int leftNodeType) {
        this.leftNodeType = leftNodeType;
    }

    public int getRightNodeType() {
        return rightNodeType;
    }

    public void setRightNodeType(int rightNodeType) {
        this.rightNodeType = rightNodeType;
    }
}

二叉树类的实现:

package DataStrcture.binarytreedemo_1;

public class BinaryTreeThreaded_copy {
    //二叉树的中序线索化 以及 线索化二叉树的中序遍历
    //指定根节点
    private BinaryTreeNodeThread_copy root;
    private BinaryTreeNodeThread_copy pre;

    public BinaryTreeThreaded_copy(BinaryTreeNodeThread_copy node){
        this.root = node;
    }
    //二叉树的中序线索化
    public void threadedBinaryTree(BinaryTreeNodeThread_copy node){
        if(node == null) return;
        //递归遍历左子树
        threadedBinaryTree(node.getLeftNode());
        //================开始线索化
            ///前驱的设置
        if(node.getLeftNode() == null){
            node.setLeftNode(pre);
            node.setLeftNodeType(1);
        }
            //后继的设置
        if( pre != null && pre.getRightNode() == null){
            pre.setRightNode(node);
            pre.setRightNodeType(1);
        }
        pre = node;// pre跟随node的脚步
        //====================线索化操作结束
        threadedBinaryTree(node.getRightNode());
    }
    public void midOrder(){
        BinaryTreeNodeThread_copy node = root;
        while(node != null){
            //一口气遍历到左子树的最左边
//            while(node.getLeftNode() != null)
            while(node.getLeftNodeType() == 0)
                node = node.getLeftNode();
            //输出左边的这个结点
            System.out.println(node);
            //借助线索往上遍历,打印出所有线索为1结点指向的那个节点
            if(node.getRightNodeType() == 1){
                node = node.getRightNode();
                System.out.println(node);
            }
            //线索不为1, 去看他的右子节点
            node = node.getRightNode();
        }
    }

    public static void main(String[] args) {
        BinaryTreeNodeThread_copy node1 = new BinaryTreeNodeThread_copy(1,"smith");
        BinaryTreeNodeThread_copy node3 = new BinaryTreeNodeThread_copy(3,"jack");
        BinaryTreeNodeThread_copy node6= new BinaryTreeNodeThread_copy(6,"rose");
        BinaryTreeNodeThread_copy node8 = new BinaryTreeNodeThread_copy(8,"john");
        BinaryTreeNodeThread_copy node10 = new BinaryTreeNodeThread_copy(10,"dick");
        BinaryTreeNodeThread_copy node14 = new BinaryTreeNodeThread_copy(14,"rolan");

        BinaryTreeThreaded_copy tree = new BinaryTreeThreaded_copy(node1);
        node1.setLeftNode(node3);
        node1.setRightNode(node6);
        node3.setLeftNode(node8);
        node3.setRightNode(node10);
        node6.setLeftNode(node14);

        tree.threadedBinaryTree(node1);
        tree.midOrder();

    }
}

在这里插入图片描述

posted @ 2022-05-26 20:31  青松城  阅读(36)  评论(0编辑  收藏  举报