上代码
- Node节点的代码
public class ThreadNode {
private int data;
private ThreadNode left;
private boolean leftTag; // 左子节点是否为线索
private ThreadNode right;
private boolean rightTag; // 右子节点是否为线索
// ... 省略get和set方法
// ... 省略构造方法
// ... 省略toString方法
}
二叉树的实体
public class ThreadTree {
private ThreadNode root; // 根节点
private int size; // 大小
private ThreadNode pre = null; // 线索化的时候保存前驱
public ThreadTree() {
this.root = null;
this.size = 0;
this.pre = null;
}
public ThreadTree(int[] data) {
this.pre = null;
this.size = data.length;
this.root = createTree(data, 1); // 创建二叉树
}
}
核心方法如下:
/**
* 创建二叉树,将一个数组变为二叉树,并且是按照数组元素的顺序
* 此方法非常的独特
* @param data
* @param index
* @return
*/
public ThreadNode createTree(int[] data, int index) {
//System.out.println(index);
if (index > data.length) {
return null;
}
ThreadNode node = new ThreadNode(data[index - 1]);
ThreadNode left = createTree(data, 2 * index);
ThreadNode right = createTree(data, 2 * index + 1);
node.setLeft(left);
node.setRight(right);
return node;
}
测试代码如下:
public class ThreadTreeTest {
public static void main(String[] args) {
int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
ThreadTree tree = new ThreadTree(data); // 创建普通二叉树
}
}
最终tree的数据结构如下图所示:
特殊的地方:按照数组中元素的顺序依次放置在tree的节点上