数据结构--线索化二叉树学习案例(java版)

数据结构–线索化二叉树学习案例(java版)

该树结构如下(线索化前):
在这里插入图片描述

中序遍历方式
线索化后(虚线表示新加节点关系)
在这里插入图片描述

全部实现代码如下:

package com.mxf.ThreadBinaryTree;

public class ThreadBinaryTreeDemo {
    public static void main(String[] args) {
        //创建叶子节点
        TreeNode root = new TreeNode(1, "A");
        TreeNode node1 = new TreeNode(3, "B");
        TreeNode node2 = new TreeNode(6, "C");
        TreeNode node3 = new TreeNode(8, "D");
        TreeNode node4 = new TreeNode(10, "E");
        TreeNode node5 = new TreeNode(14, "F");
        //还未学习递归创建树,先使用手动创建关联
        node1.setLeftChild(node3);
        node1.setRightChild(node4);
        node2.setLeftChild(node5);
        root.setLeftChild(node1);
        root.setRightChild(node2);

        ThreadBinaryTree threadBinaryTree = new ThreadBinaryTree();
        threadBinaryTree.setRoot(root);

        //线索化测试
        threadBinaryTree.threadNodes();

        //查看是否线索化成功
        System.out.println(node4.getLeftChild());
        System.out.println(node4.getRightChild());
    }
}

//定义线索化二叉树
class ThreadBinaryTree {
    private TreeNode root;
    //保存每次操作节点的前一个节点
    private TreeNode pre;

    //重载threadNodes函数
    public void threadNodes() {
        this.threadNodes(root);
    }

    //线索化当前指向的节点
    public void threadNodes(TreeNode node) {
        if(node == null) return;
        //线索化左子树
        threadNodes(node.getLeftChild());
        //线索化当前节点
        //处理前驱结点
        if(node.getLeftChild() == null) {
            node.setLeftChild(pre);
            node.setLeftType(1);
        }
        //处理后继节点
        if(pre != null && pre.getRightChild() == null) {
          pre.setRightChild(node);
          pre.setRightType(1);
        }

        //处理pre的同步移动
        pre = node;

        //线索化右子树
        threadNodes(node.getRightChild());
    }
}

class TreeNode {
    private int id;
    private String name;
    private TreeNode leftChild;
    private TreeNode rightChild;
    private static int count = 0;

    private int leftType;
    private int rightType;

    public int getLeftType() {
        return leftType;
    }

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

    public int getRightType() {
        return rightType;
    }

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

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

    public static int getCount() {
        return count;
    }

    public static void setCount(int count) {
       TreeNode.count = count;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public TreeNode getLeftChild() {
        return leftChild;
    }

    public void setLeftChild(TreeNode leftChild) {
        this.leftChild = leftChild;
    }

    public TreeNode getRightChild() {
        return rightChild;
    }

    public void setRightChild(TreeNode rightChild) {
        this.rightChild = rightChild;
    }

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

如果看不太清楚,建议在 threadBinaryTree.threadNodes();该语句处设置断点,进行deBug几次,亲测有效有助于理解,这里的线索化用到了递归实现,希望能帮助到你,如果还有疑问可以留言

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值