https://blog.youkuaiyun.com/UncleMing5371/article/details/54176252
import javax.xml.soap.Node;
/**
* @author admin
* @version 1.0.0
* @ClassName ThreadBinaryTree.java
* @Description TODO
* @createTime 2021年08月30日 18:43:00
*/
public class ThreadBinaryTree {
private Node prenode;//设定前驱结点
class Node{
String data;//存储的数据
Node left;
Node right;
Boolean isLeftThread;//判断左子节点类型,false是子节点,true是前驱线索
Boolean isRightThread;//判断右子节点类型,false是子节点,true是后继线索
Node(String data){
this.data=data;
}
//创建二叉树
Node creatBinaryTree(String[] arr,int index){//传入二叉树的data的索引
Node node=null;//头结点为空。
if(index<arr.length){
node=new Node(arr[index]);
node.left=creatBinaryTree(arr,index*2+1);//左子节点
node.right=creatBinaryTree(arr,index*2+2);//右子节点
}
return node;
}
//中序线索化二叉树
void inTreadOrder(Node node){
if(node==null){//如果没有该结点,结束递归
return;
}
//处理左子节点
inTreadOrder(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;//将该结点变为前驱结点
//处理右子树
inTreadOrder(node.right);
}
//中序遍历二叉树,按照前驱的方式遍历(从最右边结点遍历)
void inPreThreadList(Node node){
//找最后一个结点
while(node.right!=null&&node.isRightThread){
node=node.right;
}
while(node!=null){
System.out.print(node.data+",");
if(node.isRightThread){
node=node.left;//node.left就是node的前驱结点
}
else {
node=node.left;
}
}
}
}
}