28、线索二叉树

1、前序和中序线索二叉树 思路就是构建个pre指针,在交换时,注意pre和curNode节点的指针指向问题

  • 代码:
package tree;

import javax.xml.soap.Node;

public class ThreadBinaryTreeDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//1、**************演示前中后序打印结果***************
			// TODO Auto-generated method stub
			ThreadBinaryTreeNode binaryTreeNode1 = new ThreadBinaryTreeNode(1, "宋江");
			ThreadBinaryTreeNode binaryTreeNode2 = new ThreadBinaryTreeNode(2, "林冲");
			ThreadBinaryTreeNode binaryTreeNode3 = new ThreadBinaryTreeNode(3, "卢俊义");
			ThreadBinaryTreeNode binaryTreeNode4 = new ThreadBinaryTreeNode(4, "武大郎");
			ThreadBinaryTreeNode binaryTreeNode5 = new ThreadBinaryTreeNode(5, "智多星");
			ThreadBinaryTreeNode binaryTreeNode6 = new ThreadBinaryTreeNode(6, "及时雨");
			
			binaryTreeNode1.setLeftNode(binaryTreeNode2);
			binaryTreeNode1.setRightNode(binaryTreeNode4);
			binaryTreeNode2.setLeftNode(binaryTreeNode3);
			binaryTreeNode4.setLeftNode(binaryTreeNode5);
			binaryTreeNode4.setRightNode(binaryTreeNode6);
			
			ThreadBinaryTree binaryTree = new ThreadBinaryTree(binaryTreeNode1);//root
//			binaryTree.infixthread(binaryTreeNode1);
//			binaryTree.preThread(binaryTreeNode1);
			
//			binaryTree.infixOut();
//			binaryTree.preOut();
			
			
//			System.out.println(binaryTreeNode2.getRightNode());
			

	}
	
	
	

}


//构建线索二叉树
class ThreadBinaryTree{
	private ThreadBinaryTreeNode root;
	private ThreadBinaryTreeNode pre = null;
	
	public ThreadBinaryTree(ThreadBinaryTreeNode root) {
		super();
		this.root = root;
	}
	
	
	//中序线索二叉树
	public void infixthread(ThreadBinaryTreeNode node) {
		if(node == null) {
			return;
		}
		//左
		infixthread(node.getLeftNode());
		//
		if(node.getLeftNode() == null) {
			node.setLeftNode(pre);
			node.setLeftType(1);
		}
		if(pre != null && pre.getRightNode() == null) {
			pre.setRightNode(node);
			pre.setRightType(1);
		}
		pre = node;

		//右
		infixthread(node.getRightNode());
		

	}
	//中序遍历线索二叉树
	public void infixOut() {
		if(root == null) {
			return;
		}
		ThreadBinaryTreeNode temp = root;
		while(temp != null) {
			while(temp.getLeftType() == 0) {
				temp = temp.getLeftNode();
			}
			System.out.println(temp.toString());
			
			while(temp.getRightType() == 1) {
				temp = temp.getRightNode();
				System.out.println(temp.toString());
			}
			temp = temp.getRightNode();		
			
		}

	}
	
	
	//前序线索二叉树
	public void preThread(ThreadBinaryTreeNode node) {
		if(node == null) {
			return;
		}
		//
		if(node.getLeftNode() == null) {
			node.setLeftNode(pre);
			node.setLeftType(1);
		}
		if(pre != null && pre.getRightNode() == null) {
			pre.setRightNode(node);
			pre.setRightType(1);
		}
		pre = node;
		
		if(node.getLeftType() == 0) {
			preThread(node.getLeftNode());
		}
		if(node.getRightType() == 0) {
			preThread(node.getRightNode());
		}
	}
	
	
	//前序遍历线索二叉树
	public void preOut() {
		if(root == null) {
			return;
		}
		ThreadBinaryTreeNode temp = root;
		while(temp != null) {
			System.out.println(temp.toString());
			
			while(temp.getLeftType() == 0) {
				temp = temp.getLeftNode();
				System.out.println(temp.toString());
			}
			temp = temp.getRightNode();		
			
		}
	}
	
	

	
	
	
}





//定义线索二叉树的节点
class ThreadBinaryTreeNode{
	private int no;
	private String name;
	private ThreadBinaryTreeNode leftNode;//默认为空
	private ThreadBinaryTreeNode rightNode;//默认为空
	private int leftType;//左节点的类型,0:左子树;1:左前驱
	private int rightType;//右节点的类型,0:右子树;1:右后继
	
	//构造函数
	public ThreadBinaryTreeNode(int no, String name) {
		super();
		this.no = no;
		this.name = name;
	}

	
	
	public int getLeftType() {
		return leftType;
	}



	public void setLeftType(int leftType) {
		this.leftType = leftType;
	}



	public int getRightType() {
		return rightType;
	}



	public void setRightType(int rightType) {
		this.rightType = rightType;
	}



	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public ThreadBinaryTreeNode getLeftNode() {
		return leftNode;
	}

	public void setLeftNode(ThreadBinaryTreeNode leftNode) {
		this.leftNode = leftNode;
	}

	public ThreadBinaryTreeNode getRightNode() {
		return rightNode;
	}

	public void setRightNode(ThreadBinaryTreeNode rightNode) {
		this.rightNode = rightNode;
	}

	@Override
	public String toString() {
		return "BinaryTreeNode [no=" + no + ", name=" + name + "]";
	}
	
	
	
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值