线索二叉树

我们两清 提交于 2019-11-28 18:44:57

线索化二叉树的目的是为了让所有的节点的左右指针都有用武之处。一般的前中后序的便利方法并不是用到所有结点的所有指针,而线索化二叉树可以使没有用到的指针赋予新的指向方式。

(1)n个结点的二叉树有n+1个空指针域,利用二叉树中的空指针域,去存放指向该结点在某中遍历次序下的前驱和后继结点指针(这种附加的指针称为“线索”)
(2)这种加上了线索的二叉树称为线索化二叉树。根据线索执行性质可以分为前序线索二叉树,中序线索二叉树,后序线索二叉树三种。
(3)一个结点的前一个结点: 前驱节点
(4)一个结点的后一个结点: 后继结点

下面通过应用案例深入理解线索化二叉树
将下面的二叉树{}进行中序线索二叉树
在这里插入图片描述

package com.tree;

/**
 * created by wyl.. on 2019-08-27 下午 08:28
 */
public class ThreadBinaryTree<E> {
    static class Node<E>{
        E e;
        private Node left;
        private Node right;
        private int leftType;
        private int rigthType;

        public Node(E e) {
            this.e = e;
        }

        public E getE() {
            return e;
        }

        public void setE(E e) {
            this.e = e;
        }

        public Node getLeft() {
            return left;
        }

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

        public Node getRight() {
            return right;
        }

        public void setRight(Node right) {
            this.right = right;
        }

        public int getLeftType() {
            return leftType;
        }

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

        public int getRigthType() {
            return rigthType;
        }

        public void setRigthType(int rigthType) {
            this.rigthType = rigthType;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "e=" + e +
                    '}';
        }

        public void infixOrder(){
            if (this.left != null) {
                this.left.infixOrder();
            }
            System.out.println(this);
            if (this.right != null) {
                this.right.infixOrder();
            }
        }
    }

    private Node root;
    private Node pre=null;//保留前驱节点的指针
    public void setRoot(Node root) {
        this.root = root;
    }
    public void thread(){
        this.thread(root);
    }
    //遍历线索化二叉树的方法
    public void threadList(){

    }
    //进行线索化方法
    public void thread(Node node){
        if (node == null) {
            return;
        }
        //先进行左结点线索化
        thread(node.getLeft());
        //再进行当前结点
        if (node.getLeft() == null) {
            node.setLeft(pre);//例如 8 结点 的左指向为pre 此时的pre为空
            node.setLeftType(1);
        }
        //处理后继结点
        if (pre!=null && pre.getRight()==null) {
            pre.setRight(node);
            pre.setRigthType(1);
        }
        pre=node;
        thread(node.getRight());
    }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!