线索二叉树基本介绍
1)n个结点的二叉链表中含有n+1 [公式2n-(n-1)=n+1] 个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")
2)这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种
3) 一个结点的前一个结点,称为前驱结点
4) 一个结点的后一一个结点,称为后继结点
代码实现:
//编写对二叉树中序线索化的方法
/**
* @param node 就是当前线索化的节点
* */
public void threadedNodes(HeroNode node){
//不能线索化
if (node == null){
return;
}
//中序线索化,第一步先线索化左子树,
threadedNodes(node.getLeft());
//(2)线索化当前节点
//处理当前结点的前驱结点
if(node.getLeft() == null){
//让当前结点的左指针指向前驱结点
node.setLeft(pre);
//修改当前结点的左指针的类型,指向前驱结点
node.setLeftType(1);
}
//处理后继节点
if (node != null && node.getRight() == null){
pre.setRight(node);
pre.setRightType(1);
}
//(3) 线索化右子树
threadedNodes(node.getRight());
}
遍历中序线索化二叉树:
//遍历线索化二叉树的方法
public void threadedList(){
//定义一个变量,存储当前遍历的节点,从root开始
HeroNode node = root;
while (node != null){
//循环得到leftType=1的节点
//leftType=1时说明该节点时线索化的
while (node.getLeftType() == 0){
node = node.getLeft();
}
//打印这个节点
System.out.println(node);
//如果当前结点的右指针指向的是后继节点,就一直输出
while (node.getRightType() == 1){
//获取到当前结点的后继节点
node = node.getRight();
System.out.println(node);
}
node = node.getRight();
}
}