java线索二叉树_Java-线索二叉树的实现

概念性的东西,自行百度。

按照国际管理,直接上代码来分析。

1、Node节点类

package com.tree.thread;

/**

* Author: lihao

* Date:2017/8/30

* Description:ThreadBinaryTree Node

*/

public class Node

{

private int data;

private Node left;

private boolean leftIsThread; // 左孩子是否为线索

private Node right;

private boolean rightIsThread; // 右孩子是否为线索

public Node(int data)

{

this.data = data;

this.left = null;

this.leftIsThread = false;

this.right = null;

this.rightIsThread = false;

}

public int getData()

{

return data;

}

public void setData(int data)

{

this.data = data;

}

public Node getLeft()

{

return left;

}

public void setLeft(Node left)

{

this.left = left;

}

public boolean isLeftIsThread()

{

return leftIsThread;

}

public void setLeftIsThread(boolean leftIsThread)

{

this.leftIsThread = leftIsThread;

}

public Node getRight()

{

return right;

}

public void setRight(Node right)

{

this.right = right;

}

public boolean isRightIsThread()

{

return rightIsThread;

}

public void setRightIsThread(boolean rightIsThread)

{

this.rightIsThread = rightIsThread;

}

@Override

public boolean equals(Object obj)

{

if (obj instanceof Node)

{

Node temp = (Node) obj;

if (temp.getData() == this.data)

{

return true;

}

}

return false;

}

@Override

public int hashCode()

{

return super.hashCode() + this.data;

}

}

2、创建二叉树、二叉树中序线索化(线索化有3种,此处单讲中序)

package com.tree.thread;

public class ThreadTree {

private Node root; // 根节点

private Node pre = null; // 线索化的时候保存前驱

public ThreadTree() {

this.root = null;

this.pre = null;

}

public ThreadTree(int[] data) {

this.pre = null;

this.root = createTree(data, 0); // 创建二叉树

}

/**

* 创建二叉树

*/

public Node createTree(int[] data, int index) {

if (index >= data.length) {

return null;

}

Node node = new Node(data[index]);

node.setLeft(createTree(data, 2 * index + 1));

node.setRight(createTree(data, 2 * index + 2));

return node;

}

/**

* 将以root为根节点的二叉树线索化 中序法

*/

public void inThread(Node root) {

if (root != null) {

inThread(root.getLeft()); // 线索化左孩子

if (null == root.getLeft()) // 左孩子为空

{

root.setLeftIsThread(true); // 将左孩子设置为线索

root.setLeft(pre);

}

if (pre != null && null == pre.getRight()) // 右孩子为空

{

pre.setRightIsThread(true);

pre.setRight(root);

}

pre = root; //每次将当前节点设置为pre

inThread(root.getRight()); // 线索化右孩子

}

}

/**

* 中序遍历线索二叉树

*/

public void inThreadList(Node root) {

if (root == null) {

return;

}

//查找中序遍历的起始节点

while (root != null && !root.isLeftIsThread()) {

root = root.getLeft();

}

while (root != null) {

System.out.print(root.getData() + ",");

if (root.isRightIsThread()) // 如果右孩子是线索

{

root = root.getRight();

} else // 有右孩子

{

root = root.getRight();

while (root != null && !root.isLeftIsThread()) {

root = root.getLeft();

}

}

}

}

/**

* 中序遍历

*/

public void inList(Node root) {

if (root != null) {

inList(root.getLeft());

System.out.print(root.getData() + ",");

inList(root.getRight());

}

}

public Node getRoot() {

return root;

}

public void setRoot(Node root) {

this.root = root;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值