上代码
- 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的节点上