我的思路是(前序遍历为例):1、把原来树的结点按顺序存储到arrayList中。
2、遍历原来的树,左指针为空就把它左指针指向数组中前一位,右指针同理指向下一位。
3、在数字类添加 leftNum 和 rightnum 辅助展示遍历。
public class ThreadedBinaryTreeDemo {
public static void main(String[] args) {
ArrayList<Num2> arrayList = new ArrayList<Num2>();
arrayList.add(new Num2(5));
arrayList.add(new Num2(4));
arrayList.add(new Num2(9));
arrayList.add(new Num2(3));
arrayList.add(new Num2(7));
arrayList.add(new Num2(6));
ThreadedBinaryTree threadedBinaryTree = new ThreadedBinaryTree();
for (Num2 num2 : arrayList) {
threadedBinaryTree.add(num2);
}
threadedBinaryTree.threaded();
threadedBinaryTree.show();
// threadedBinaryTree.show2();
}
}
class ThreadedBinaryTree {
Num2 head;
ArrayList<Num2> arrayList2 = new ArrayList<Num2>();
//添加节点
public void add(Num2 num) {
Num2 counter = head;
if (head == null) {
head = num;
} else {
judge(num,counter);
}
}
//判断如何添加节点
public void judge(Num2 num, Num2 counter) {
if (num.i < counter.i && counter.left != null) {
counter = counter.left;
judge(num, counter);
} else if (num.i < counter.i && counter.left == null) {
counter.left = num;
}else if (num.i > counter.i && counter.right != null) {
counter = counter.right;
judge(num, counter);
} else if (num.i > counter.i && counter.right == null) {
counter.right = num;
}
}
//前序遍历并把Num2对象添加到arraylist数组
public void traversal(Num2 num) {
arrayList2.add(num);
if (num.left != null) {
traversal(num.left);
}
if (num.right != null) {
traversal(num.right);
}
}
//线索化
public void threaded() {
Num2 counter = head;
//用来辅助提取集合中对象
int i = 0;
if (counter == null) {
System.out.println("空表");
} else {
//调用的是添加到集合中的方法,方法名有点像,不要混
traversal(counter);
}
//遍历集合,判断左右指针是否为空,发现为空马上赋值
for (Num2 num2 : arrayList2) {
if (num2.left == null) {
//防止出现空指针
if (i != 0) {
num2.left=arrayList2.get(i-1);
//方便后面展示新数组,发现leftnum=1就不往左边进行了
num2.leftnum = 1;
}
}
if (num2.right == null) {
//防止出现空指针
if (i<arrayList2.size()-1)
num2.right = arrayList2.get(i + 1);
//方便后面展示新数组,发现rightnum=1就不往右边进行了
num2.rightnum = 1;
}
i++;
}
}
//展示
public void show() {
//此时head依旧是head,因为跟head这个词无关,与head代表的对象有关
Num2 couter = head;
if (head == null) {
System.out.println("空树");
} else {
traversalThread(couter);
}
System.out.println();
}
//判断如何展示
public void traversalThread(Num2 num) {
System.out.println(num.i);
if (num.leftnum == 1) {
System.out.println("前缀指向"+num.left.i);
}
if (num.rightnum == 1) {
if (num.right != null) {
System.out.println("后缀指向"+num.right.i);
}
}
if (num.left != null && num.leftnum == 0) {
traversalThread(num.left);
}
if (num.right != null && num.rightnum == 0) {
traversalThread(num.right);
}
}
}
class Num2 {
int i;
Num2 left;
Num2 right;
int leftnum;
int rightnum;
Num2(int i) {
this.i = i;
}
}
总结:
arrayList中每个对象实际就是一颗子树。
总的来说就是把对象放到集合里,遇见有空指针直接赋值。中序后序同理。
如果有不对的地方欢迎大佬指点。
不懂的地方也欢迎留言,期待和大家一起学习成长。