一、线索二叉树
1.1 结构
标志位为0时表示节点的对应lnode,rnode保存的是左右子树的引用,否则保存的是前驱节点或者后驱节点的引用。
public class node {
// 节点的权值ֵ
public int value;
//左子树和右子树
public node lNode;
public node rNode;
//左标记
public int lflag = 0;
//右标记
public int rflag = 0;
}
1.2 线索二叉树的建立(中序)
- 先处理最左的左子节点
- 再处理前驱节点(相当于根节点)
- 最后处理右子树
/**
* 中序建立线索二叉树
*/
// 中序建立二叉树
public void setBinTree(node node) {
if (node == null)
return;
// 处理左子树
if (node.lNode != null) {
setBinTree(node.lNode);
}
if (node.lNode == null) {
node.lNode = pre;
node.lflag = 1;
}
// 处理前驱节点(可以看做根节点)
if (pre != null && pre.rNode == null) {
pre.rNode = node;
pre.rflag = 1;
}
// 记录当前的节点然后处理右子树
pre = node;
// 处理后驱节点(右子树)
if (node.rNode != null)
setBinTree(node.rNode);
}
1.3 线索二叉树的遍历
- 找到开始的节点(最左子树)
- 按照线索往下查找
- 跳过不具有线索的节点,让他指向右子节点。循环步骤
//遍历线索二叉树
public void Search(){
node start = this;
while(start != null){
//寻找最左边的那个节点
while(start.lflag == 0){
start = start.lNode;
}
System.out.println(start.value);
//开始用线索遍历
while(start.rflag == 1){
start = start.rNode;
System.out.println(start.value);
}
//跳过非线索点
start = start.rNode;
}
}
}
public void Search(){
if(root == null){
return;
}
else root.Search();
}
1.4 测试
package threadBibaryTree;
public class test {
public static void main(String[] args) {
node root0 = new node(0);
root root = new root();
root.setRoot(root0);
node root1 = new node(1);
node root2 = new node(2);
node root3 = new node(3);
node root4 = new node(4);
node root5 = new node(5);
node root6 = new node(6);
root0.lNode = root1;
root0.rNode = root2;
root1.lNode = root3;
root1.rNode = root4;
root2.lNode = root5;
root2.rNode = root6;
root.middBinTree();
root.Search();
}
}
结果:
3
1
4
0
5
2
6