线索化二叉树
简而言之,n个结点的二叉树会形成n+1个空的指针域,那么就会造成指针的浪费,所以用这些空的指针指向该结点的在某种次序下的前驱或者后继结点的指针。这些指针称为线索,加上线索的二叉树称为线索二叉树。
二叉树的遍历的本质是将一个复杂的非线性结构转换为线性结构,使得每个节点都有了唯一的前驱和后继。(第一个节点无前驱,最后一个节点无后继)对于二叉树的一个节点,查找其左右子节点是方便的,其前驱后继只有在遍历中得到。
- 优点:利用线索化二叉树进行中序遍历时,不需要采用堆栈处理,速度比一般二叉树的遍历快,且节约存储空间,任意一个节点都能直接找到它的前驱和后继节点
- 不足:节点的插入和删除比较麻烦,且速度也比较慢。线索子树不能共用。
1 | package Tree; |
线索化二叉树的遍历:
线索化之后,各个节点的指向有所变化,因此原来的遍历方式不能再使用,需要使用新的方式遍历线索化二叉树,各个节点可以通过线性方式遍历,无需使用递归的方式,提高了遍历的效率,遍历的次序应该和中序遍历保持一致.
就是先找到有前驱节点的节点(刚开始肯定是叶子节点,然后遍历有rightType的节点输出,然后将当前节点设置为右边的节点,进行下一轮的遍历)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public void threadedList(){
//存储当前遍历的节点
HeroNode node = root;
while (node != null){
//循环的找到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();
}
}