二叉树的线索链表存储结构
二叉链表的空间利用情况:
在n(n≥1)个结点的二叉树左右链表示中,只有n-1个指向子树的指针,却有n+1个空指针域。
如何利用空指针域解决上述问题?
- 若结点p有左孩子,则p->lchild指向其左孩子结点,否则令其指向其(先序、中序、后序、层序)前驱;
- 若结点p有右孩子,则p->rchild指向其右孩子结点,否则令其指向其(先序、中序、后序、层序)后继;
如何区分指针是指向其左/右孩子的指针还是指向某种遍历的前驱/后继?
在每个结点中增加两个标志位,以区分该结点的的两个链 域是指向其左/右孩子还是指向某种遍历的前驱/后继。
节点结构:
线索:将结点的空指针域指向其前驱/后继的指针被称为线索;
线索化:结点的空链域存放其前驱/后继的过程称为线索化;
线索二叉树:线索化的二叉树称为线索二叉树。
二叉树的遍历方式有4种,故有4种意义下的前驱和后继,相应的有4种线索二叉树:
- 先序线索二叉树
- 中序线索二叉树
- 后序线索二叉树
- 层序线索二叉树
对二叉树进行中序线索化
定义线索树结构如下:
class TreeNode{
private int no;
private String name;
private TreeNode left; //默认null
private TreeNode right; //默认null
//说明
//1. 如果leftType == 0 表示指向的是左子树, 如果 1 则表示指向前驱结点
//2. 如果rightType == 0 表示指向是右子树, 如果 1表示指向后继结点
private int leftType;
private int rightType;
public TreeNode(int no, String name) {
this.no = no;this.name = name; }
public int getNo() {