- n个结点的二叉链表中含有
2n-(n-1)=n+1
个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索") - 这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
public class ThreadedBinaryTree {
private TreeNode root;
private TreeNode pre;
public ThreadedBinaryTree(TreeNode root) {
super();
this.root = root;
}
public void infixList() {
TreeNode cur = root;
while (cur != null) {
while (cur.leftType == 0) {
cur = cur.left;
}
System.out.println(cur);
while (cur.rightType == 1) {
cur = cur.right;
System.out.println(cur);
}
cur = cur.right;
}
}
public void infixThreadedTreeNodes(TreeNode treeNode) {
if (treeNode == null) {
return;
}
infixThreadedTreeNodes(treeNode.left);
if (treeNode.left == null) {
treeNode.left = pre;
treeNode.leftType = treeNode.PRECURSOR_OR_SUCCESSOR;
}
if (pre != null && pre.right == null) {
pre.right = treeNode;
pre.rightType = treeNode.PRECURSOR_OR_SUCCESSOR;
}
pre = treeNode;
infixThreadedTreeNodes(treeNode.right);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
int leftType;
int rightType;
static final int SUBTREE = 0;
static final int PRECURSOR_OR_SUCCESSOR = 1;
public TreeNode(int val) {
super();
this.val = val;
}
@Override
public String toString() {
return "TreeNode [val=" + val + "]";
}
}