}
package threadbinarytree;
import java.util.Scanner;
public class ThreadTree<T> {
protected ThreadNode<T> head=null;
public static final String ENDFLAG="#";
public ThreadTree() {
}
public ThreadTree(ThreadNode<T> head) {
this.head = head;
}
//初始化根节点
public void initThreadTree(){
String item=null;
Scanner sc=new Scanner(System.in);
System.out.println("请输入根节点");
item=sc.nextLine();
if(!item.equalsIgnoreCase(ENDFLAG)){
head=new ThreadNode(item);
init(head);
}
}
//初始化二叉树
private void init(ThreadNode<T> head){
String item=null;
Scanner sc=new Scanner(System.in);
System.out.println("请输入"+head.getData()+"的左孩子节点");
item=sc.nextLine();
if(!item.equalsIgnoreCase(ENDFLAG)){
head.setLeftNode(new ThreadNode(item));
init(head.getLeftNode());
}
System.out.println("请输入"+head.getData()+"的右孩子节点");
item=sc.nextLine();
if(!item.equalsIgnoreCase(ENDFLAG)){
head.setRightNode(new ThreadNode(item));
init(head.getRightNode());
}
}
//创建线索二叉树
public void createThreadTree(){
}
//中序遍历
public void inTraverse(){
}
// //先序遍历
// public void PreOrder(){
// PreOrder(head);
// }
// private void PreOrder(ThreadNode<T> head){
// if(head!=null){
// System.out.print(head.getData()+" ");
// PreOrder(head.getLeftNode());
// PreOrder(head.getRightNode());
// }
// }
}
package threadbinarytree;
//中序线索二叉树类
public class InThreadTree<T> extends ThreadTree<T>{
//全局的前驱
private ThreadNode<T> pre=null;
public InThreadTree(){
super();
}
@Override
public void initThreadTree() {
super.initThreadTree();
}
//创建线索二叉树
@Override
public void createThreadTree() {
inThread(head);
}
//将二叉树进行线索化
public void inThread(ThreadNode<T> root){
if(root != null){
inThread(root.getLeftNode()) ;//线索化左孩子
if(null == root.getLeftNode()&&(0==root.getLflag())){//左孩子为空
root.setLflag(1) ;//将左孩子设置为线索
root.setLeftNode(pre) ;
}
if(pre!=null&&null == pre.getRightNode()){//右孩子为空
pre.setRflag(1);
pre.setRightNode(root) ;
}
pre = root ;
inThread(root.getRightNode()) ;//线索化右孩子
}
}
/**
* 中序遍历线索二叉树
* @param root
*/
@Override
public void inTraverse(){
ThreadNode<T> root=this.head;
if(root != null){
while(root!=null && (root.getLflag()==0)){//如果左孩子不是线索
root = root.getLeftNode() ;//
}
do{
System.out.print(root.getData() + ",");
if(root.getRflag()==1){//如果右孩子是线索
root = root.getRightNode();
}else{//有右孩子
root = root.getRightNode() ;
while(root!=null && (root.getLflag()==0)){
root = root.getLeftNode() ;
}
}
}while(root != null) ;
}
}
public static void main(String[] args) {
ThreadTree<String> tree=new InThreadTree<String>();
tree.initThreadTree();
tree.createThreadTree();
tree.inTraverse();
}
}