线索二叉树实现

public class Helloworld {
	
	public static void main(String[] args) {
		Tree tree = new Tree();
		tree.CreateTreeByKeyboard();
		tree.Thread_Head_In();
		tree.InorderTraverse_Thread1();
	}
}


class Tree
{
	private TreeNode head;
	private TreeNode root;
	private TreeNode pre;
	
	//键盘创建树
    public void CreateTreeByKeyboard()
    {
        root = CrKeyboard();
    }

    //简略,没有考虑异常情况,先序,需要一个扩展二叉树的输入
    private TreeNode CrKeyboard()
    {
        String numStr = null;
		try {
			numStr = new BufferedReader(new InputStreamReader(System.in)).readLine();
		} catch (IOException e) {
			System.out.println("CrKeyboard发生IO异常");
		}
        if(numStr.equals("x") )
        {
            return null;
        }
        else
        {
            TreeNode node = new TreeNode();
            node.data = Integer.parseInt(numStr);
            node.left = CrKeyboard();
            node.right = CrKeyboard();
            if(node.left!=null)
            	node.leftSignal = LinkType.Link;
            if(node.right!=null)
            	node.rightSignal = LinkType.Link;
            return node;
        }
    }

    public void InThreading()  //普通线索
    {
    	In_Thread(root);
    }
    private void In_Thread(TreeNode node)
    {
    	if(node!=null)
    	{
    		In_Thread(node.left);
    		if(node.left==null)
    		{
    			node.left = pre;
    			node.leftSignal = LinkType.Thread;
    		}
    		if(pre!=null)
    		{
    			if(pre.right==null)
    			{
    				pre.right = node;
    				pre.rightSignal = LinkType.Thread;
    			}
    		}
    		pre = node;
    		In_Thread(node.right);
    	}
    }
    
    public void Thread_Head_In()  //加上头结点的线索
    {
    	head = new TreeNode();
    	head.leftSignal = LinkType.Link;
    	head.rightSignal = LinkType.Thread;
    	head.right = head;
    	if(root==null)
    		head.left = head;
    	else
    	{
    		head.left = root;
    		pre = head;//让InThreading最左下角的指向head
    		InThreading();
    		pre.right = head;//pre变成了最右下角
    		pre.rightSignal = LinkType.Thread;
    		head.right = pre;
    	}
    }
    
    public void InorderTraverse_Thread()  //通过后继访问
    {
    	TreeNode node = head.left;
    	while(node != head)
    	{
    		while(node.leftSignal == LinkType.Link)
    			node = node.left;
    		System.out.println(node.data);
    		while(node.right!= head && node.rightSignal== LinkType.Thread)
    		{
    			node = node.right;
    			System.out.println(node.data);
    		}
    		node = node.right;
    	}
    }
    
    public void InorderTraverse_Thread1()
    {
    	TreeNode node = head.left;
    	while(node != head)
    	{
    		while(node.rightSignal == LinkType.Link)
    			node = node.right;
    		System.out.println(node.data);
    		while(node.left!= head && node.leftSignal== LinkType.Thread)
    		{
    			node = node.left;
    			System.out.println(node.data);
    		}
    		node = node.left;
    	}
    }
}

class TreeNode
{
	public int data;
	public TreeNode left;
	public TreeNode right;
	public LinkType leftSignal;
	public LinkType rightSignal;
}

enum LinkType
{ Link,Thread }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值