上代码
- 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) {ThreadNode node = null;if (index <= data.length) {node = new ThreadNode(data[index - 1]);node.setLeft(createTree(data, 2 * index));node.setRight(createTree(data, 2 * index + 1));}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的节点上