栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

中序线索二叉树的简单实现(Java)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

中序线索二叉树的简单实现(Java)

二叉树的代码稍微有点抽象,并且运用了递归,猛一看会有点难以理解,建议在了解理论知识的前提下,在草稿纸上画一个二叉树,结合代码实现线索二叉树。

1.定义结点
package tree.cluetree;

public class Node {

    private int no;

    private String name;

    private Node left;

    private Node right;

    // 0表示左子树 1表示前驱结点
    private int noLeft;

    // 0表示右子树 1表示后继结点
    private int noRight;

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

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    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 getNoLeft() {
        return noLeft;
    }

    public void setNoLeft(int noLeft) {
        this.noLeft = noLeft;
    }

    public int getNoRight() {
        return noRight;
    }

    public void setNoRight(int noRight) {
        this.noRight = noRight;
    }

    public Node(int no, String name) {
        this.no = no;
        this.name = name;
    }

}
2.定义线索二叉树
package tree.cluetree;

public class ClueTree {

    private Node root;

    // 初始化前驱结点
    private Node pre = null;

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

    
    public void clueNode(Node node) {
        if (node == null) {
            return;
        }

        // 线索化左子树
        clueNode(node.getLeft());

        // 左下结点为中序遍历第一个结点,前驱结点设为空
        if (node.getLeft() == null) {
            node.setLeft(pre);
            node.setNoLeft(1);
        }

        // 如果当前节点的前驱结点不为空并且其右子树为空,则把当前结点设为其前驱结点的后继结点
        if (pre != null && pre.getRight() == null) {
            pre.setRight(node);
            pre.setNoRight(1);
        }


        pre = node;

        clueNode(node.getRight());

    }

    // 中序遍历线索二叉树
    public void clueList() {
        Node node = root;

        while (node != null) {
            while (node.getNoLeft() == 0) {
                node = node.getLeft();
            }

            System.out.println(node);

            while (node.getNoRight() == 1) {
                node = node.getRight();
                System.out.println(node);
            }

            node = node.getRight();
        }
    }

}
3.简单测试
package tree.cluetree;

import tree.cluetree.Node;

public class Test {
    public static void main(String[] args) {

        Node root = new Node(0, "zzz");
        Node node1 = new Node(1, "aaa");
        Node node2 = new Node(2, "bbb");
        Node node3 = new Node(3, "ccc");
        Node node4 = new Node(4, "ddd");
        Node node5 = new Node(5, "eee");
        Node node6 = new Node(6, "fff");


        root.setLeft(node1);
        root.setRight(node2);
        node1.setLeft(node3);
        node1.setRight(node4);
        node2.setLeft(node5);
        node2.setRight(node6);

        ClueTree t = new ClueTree();
        t.setRoot(root);

        // 把普通二叉树线索化为线索二叉树
        t.clueNode(root);

        t.clueList();

        System.out.println("node4节点的前驱是:" + node4.getLeft().getNo() + "  后继节点是:" + node4.getRight().getNo() );



    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/658550.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号