import java.util.Scanner;
import static java.lang.System.*;
public class Tree
{
class TreeNode
{
String data; //元素数据
TreeNode left; //左子树结点
TreeNode right; //右子树结点
}
static final int MAXLEN=20;
static Scanner input=new Scanner(System.in);
TreeNode InitTree( ) //1初始化二叉树的根
{
TreeNode node=new TreeNode();
if ( node!=null)
{
out.println("请先输入一个根结点数据:");
node.data=input.next();
node.left=null;
node.left=null;
return node;
}
else
return null;
}
void Add( TreeNode treeNode) //2.添加结点
{
TreeNode pnode=new TreeNode();
TreeNode parent;
String data;
int menusel;
if( pnode!=null )
{
out.println("请输入二叉树结点数据:");
pnode.data=input.next();
pnode.left=null;
pnode.right=null;
out.println("输入该结点的父节点数据:");
data=input.next();
parent=FindNode(treeNode ,data);
if(parent==null)
{
out.println("未找到该父结点!");
pnode=null;
return ;
}
out.println("选择1.添加该结点到左子树 2.添加该结点到右子树!");
menusel=input.nextInt();
if(menusel==1 || menusel==2)
{
if(parent==null)
{
out.println("不存在父结点,请先设置父结点!");
}
else
{
if(menusel==1)
{
if (parent.left!=null)
out.println("左子树结点不为空!");
else
parent.left=pnode;
}
else if(menusel==2)
{
if (parent.right!=null)
out.println("右子树结点不为空!");
else
parent.right=pnode;
}
}
}
}
}
TreeNode FindNode(TreeNode treeNode ,String data) //3.查找结点
{
TreeNode ptr;
if(treeNode==null)
{
return null;
}
else
{
if(treeNode.data.equals(data))
{
return treeNode;
}
else
{
if( (ptr =FindNode(treeNode.left ,data))!=null )
{
return ptr;
}
else if ((ptr=FindNode (treeNode.right , data)) !=null)
{
return ptr;
}
else
{
return null;
}
}
}
}
TreeNode LeftNode(TreeNode treeNode) //4.获取左子树
{
if(treeNode!=null)
{
return treeNode.left;
}
else
{
return null;
}
}
TreeNode RightNode(TreeNode treeNode) //5.获取右子树
{
if(treeNode!=null)
{
return treeNode.right;
}
else
{
return null;
}
}
boolean isEmpty(TreeNode treeNode) //6.判断是否为空树
{
if(treeNode!=null)
{
return true;
}
else
{
return false;
}
}
int Depth(TreeNode treeNode) //7.获取树深度
{
int depleft ,depright;
if(treeNode==null)
{
return 0;
}
else
{
depleft=Depth(treeNode.left);
depright=Depth(treeNode.right);
return Math.max(depleft+1,depright+1);
}
}
void NodeData(TreeNode p) //8.显示结点数据
{
out.print(p.data);
}
void LevelOrderTraversal(TreeNode treeNode) //9.层次遍历
{
TreeNode p;
TreeNode[] q=new TreeNode[MAXLEN];
int head =0, tail=0;
if(treeNode !=null)
{
tail=(tail+1)%MAXLEN;
q[tail]=treeNode;
}
while(head!=tail)
{
head=(head+1)%MAXLEN;
p=q[head];
NodeData(p);
out.print(" ");
if(p.left !=null)
{
tail=(tail+1)%MAXLEN;
q[tail]=p.left;
}
if(p.right != null)
{
tail=(tail+1)%MAXLEN;
q[tail]=p.right;
}
}
}
void PreorderTraversal(TreeNode treeNode) //10.先序遍历
{
if(treeNode !=null)
{
NodeData(treeNode);
out.print(" ");
PreorderTraversal(treeNode.left);
PreorderTraversal(treeNode.right);
}
}
void InorderTraversal(TreeNode treeNode) //11.中序遍历
{
if(treeNode !=null)
{
InorderTraversal(treeNode.left);
NodeData(treeNode);
out.print(" ");
InorderTraversal(treeNode.right);
}
}
void PostorderTraversal(TreeNode treeNode) //12.后序遍历
{
if(treeNode !=null)
{
PostorderTraversal(treeNode.left);
PostorderTraversal(treeNode.right);
NodeData(treeNode);
out.print(" ");
}
}
public static void main(String[] args)
{
TreeNode root=null;//新建根节点
int n;
Tree t=new Tree( ); //建树
out.println("输入二叉树结点个数:");
n=input.nextInt();
root=t.InitTree();
for(int i=0 ; i<n-1 ; i++)
{
t.Add(root);
}
out.println(t.Depth(root));
t.LevelOrderTraversal(root);//层序遍历
out.println();
t.PreorderTraversal(root);//先序遍历
out.println();
t.InorderTraversal(root);//中序遍历
out.println();
t.PostorderTraversal(root);//后序遍历
}
}