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 }
线索二叉树实现
最新推荐文章于 2023-11-29 15:34:49 发布