线索二叉树
含义:可以通过充分利用二叉树种的空指针域来存放在某种方式遍历下的前驱指针和后继指针,我们把指向前驱和后继的指针称为线束,加上线索的二叉树称为线索二叉树。
Node定义
比普通的节点多出来两个bool类型,用来指示左右指针是指向子节点还是线索。
public static class Node
{
String data;//数据域
Node left;//左指针域
Node right;//右指针域
boolean isLeftThread=false;//左指针域类型 false指向子节点,right指向前驱线索
boolean isRightThread=false;//右指针域类型 false指向子节点,right指向后继线索
public Node(String data)
{
this.data=data;
}
}
构建线性二叉树
1、在遍历节点时,利用一个prenode来保存上一个遍历的节点
2、对二叉树进行中序遍历,将所有节点的右子节点为空的指针指向它的后继节点(preNode.right=node)。
3、将所有节点的左子节点为空的指针域指向它的前继节点(node.left=preNode)。
程序
package Tree;
public class ThreadBinaryTree {
//定义节点结构
static class Node
{
String data;//数据域
Node left;//左指针域
Node right;//右指针域
boolean isLeftThread=false;//左指针域类型 false指向子节点,right指向前驱线索
boolean isRightThread=false;//右指针域类型 false:指向子节点、right指向后继线索
public Node(String data)
{
this.data=data;
}
}
//线索化时记录一个节点
private Node preNode;
//通过数组构造一个二叉树
public Node createBinaryTree(String[]array,int index) {
Node node=null;
if(index<array.length)
{
node=new Node(array[index]);
node.left=createBinaryTree(array, index*2+1);
node.right=createBinaryTree(array, index*2+2);
}
return node;
}
//中序线索化二叉树
void inThreadOrder(Node node)
{
if(node==null)
{
return;
}
//处理左子树
inThreadOrder(node.left);
//左指针为空,将左指针指向前驱节点
if(node.left==null)
{
node.left=preNode;
node.isLeftThread=true;
}
//前一个节点的后继节点指向当前节点
if(preNode!=null && preNode.right==null)
{
preNode.right=node;
preNode.isRightThread=true;
}
preNode=node;
//处理右子树
inThreadOrder(node.right);
}
//中序遍历线索二叉树,按照后继方式遍历
public void inThreadList(Node node) {
//找中序遍历开始的节点-------最左面的点
while (node!=null && !node.isLeftThread) {
node=node.left;
}
while (node!=null) {
System.out.print(node.data+",");
if(node.isRightThread)
{
node=node.right;
}
else {
//如果右指针不是线索,找到右子树开始的节点
node=node.right;
while (node!=null&&!node.isLeftThread) {
node=node.left;
}
}
}
}
}