Java实现线索二叉树及中序遍历

线索二叉树
含义:可以通过充分利用二叉树种的空指针域来存放在某种方式遍历下的前驱指针和后继指针,我们把指向前驱和后继的指针称为线束,加上线索的二叉树称为线索二叉树。
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;
				
			}
		}
		}
		
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值