线索化二叉树

class ThreadedBinaryTree{
    private Node root;
    private Node pre=null;

    public void setRoot(Node root) {
        this.root = root;
    }

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

    //前序线索化
    public void threadedNodesPre(Node 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()==0)
            threadedNodes(node.getLeft());
        if(node.getRightType()==0)
            threadedNodes(node.getRight());
    }

    //后序线索化
    public void threadedNodesPost(Node node){
        if(node==null)
            return;
        if(node.getLeftType()==0)
            threadedNodes(node.getLeft());
        if(node.getRightType()==0)
            threadedNodes(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;
    }
}

Node节点类添加了:

    private int leftType;//0表示指向左子树,1表示指向前驱节点
    private int rightType;//0表示指向右子树,1表示指向后继节点

    public int getLeftType() {
        return leftType;
    }

    public int getRightType() {
        return rightType;
    }

    public void setLeftType(int leftType) {
        this.leftType = leftType;
    }

    public void setRightType(int rightType) {
        this.rightType = rightType;
    }

遍历中序线索化二叉树

  //遍历中序线索化二叉树
    public void threadedList(){
        Node 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();
        }
    }

优势

(1)利用线索二叉树进行中序遍历时,不必采用堆栈处理,速度较一般二叉树的遍历速度快,且节约存储空间

(2)任意一个结点都能直接找到它的前驱和后继结点

不足

(1)结点的插入和删除麻烦,且速度也较慢

(2)线索子树不能共用

https://baike.baidu.com/item/%E7%BA%BF%E7%B4%A2%E4%BA%8C%E5%8F%89%E6%A0%91/10810037?fr=aladdin

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容