1.概念
n个结点的二叉链表中含有n+1个空指针域。
利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")
例如为10的这个节点,它的前驱节点为3,后继节点为1.
2.中序线索化代码
public class Main {
public static void main(String[] args) {
HeroNode root = new HeroNode(1, "tom" );
HeroNode node2 = new HeroNode(3, "jack");
HeroNode node3 = new HeroNode(6, "smith");
HeroNode node4 = new HeroNode(8,"mary");
HeroNode node5 = new HeroNode(10,"king");
HeroNode node6 = new HeroNode(14, "dim");
root.left = node2;
root.right = node3;
node2.left = node4;
node2.right = node5;
node3.left = node6;
System.out.println("线索化之前 id为10的left为:"+ node5.left + " right为:"+ node5.right);
ThreadedBinaryTree threadedBinaryTree = new ThreadedBinaryTree(root);
threadedBinaryTree.threadedNodes(root);
System.out.println("线索化之后 id为10的left为:"+ node5.left + " right为:"+ node5.right);
}
}
class ThreadedBinaryTree{
HeroNode root;
HeroNode preCurNode = null;//指向当前节点的前一个节点
public ThreadedBinaryTree(HeroNode root) {
this.root = root;
}
//中序线索化二叉树
public void threadedNodes(HeroNode curNode){
if (curNode == null){
//System.out.println("当前节点为null 无法线索化");
return;
}
//先向左递归
threadedNodes(curNode.left);
//然后对当前节点进行线索化
//对当前节点的左指针进行线索化
if (curNode.left == null){
curNode.left = preCurNode;
curNode.HERO_NODE_TYPE_LEFT = 1;//说明左指针指向了前驱节点
}
//对右指针的线索化是下一轮进行的
if (preCurNode != null && preCurNode.right == null){
preCurNode.right = curNode;
preCurNode.HERO_NODE_TYPE_RIGHT = 1;
}
preCurNode = curNode;
//最后向右递归
threadedNodes(curNode.right);
}
}
//树的每个节点
class HeroNode{
int id;
String name;
HeroNode left;
HeroNode right;
//节点指针类型
//如果值为1说明节点左 或者 右指针指向的是前驱 或者 后继节点
//如果值为0说明节点左 或者 右指针指向的是左 或者 右子树
int HERO_NODE_TYPE_LEFT = 0;
int HERO_NODE_TYPE_RIGHT = 0;
public HeroNode(int id, String name) {