1.线索二叉树的结构
public class Tree{
private static class BTNode{
public int data;
public BTNode lchild;
public BTNode rchild;
public int ltag;
public int rtag;
}
private BTNode root;
}
2.二叉树的线索化及线索二叉树的遍历(以中序线索二叉树为例)
- 与对应的二叉树的遍历顺序的递归形式类似,将visit()函数换成处理线索的代码
2.1中序二叉树的线索化
/**
* 中序二叉树线索化
* 外层结构类似中序遍历二叉树递归形式
* 线索化是按照遍历顺序,遍历完当前节点就变成下个节点的前驱了
* 处理当前节点前去和前驱节点后继
*/
private void inThread(BTNode p, BTNode pre){
if(p != null){
inThread(p.lchild, pre);
if(p.lchild == null){
p.ltag = 1;
p.lchild = pre;
}
if(pre != null && pre.rchild == null){
pre.rtag = 1;
pre.rchild = p;
}
pre = p;
inThread(p.rchild, pre);
}
}
public void buildInThread(BTNode root){
if(root != null){
BTNode pre = null;
inThread(root, pre);
pre.rchild = null;
pre.rtag = 1;
}
}
2.2中序线索二叉树的操作
public BTNode first(BTNode p){
while(p.ltag == 0 ){
p = p.lchild;
}
return p;
}
public BTNode last(BTNode p){
while(p.rtag == 0){
p = p.rchild;
}
return p;
}
public BTNode successor(BTNode p){
if(p.rtag == 0){
return first(p.rchild);
}
return p.rchild;
}
public BTNode precursor(BTNode p){
if(p.ltag == 0){
return last(p.lchild);
}
return p.lchild;
}
public void inorder(TBTNode root){
for(TBTNode p = first(root); p != null; p=successor(p)){
visit(p);
}
}