为了节省篇幅,主函数没有写,各位技术大佬看完作者其他文章也可以给提一下意见,作者是初学者,很多地方写的不够好
package 算法.二叉树;
import java.util.Scanner;
import java.util.concurrent.Callable;
class CBType{
String data;
CBType left;
CBType right;
}
public class erchashu {
static final int Maxlen=20;
static Scanner input=new Scanner(System.in);
//c初始化二叉树的根
CBType IntTree()
{
CBType node;
if ((node=new CBType())!=null)
{
System.out.print("请先输入一个根节点\n");
node.data=input.next();
node.left=null;
node.right=null;
if (node!=null)
{
return node;
}return null;
}
return null;
}
//添加结点
void Adddata(CBType treenode)
{
CBType pnode,parent;
String data;
int mesuel;
if ((pnode=new CBType())!=null) {
System.out.print("请先输入一个根节点\n");
pnode.data = input.next();
pnode.left = null;
pnode.right = null;
System.out.println("输入该节点的父节点数据");
data=input.next();
parent=Treefindnode(treenode,data);
if (parent==null)
{
System.out.println("未找到父节点");
pnode=null;
return;
}
System.out.printf("1.添加该节点到左子树\n2.添加该节点到右子树\n");
do {
mesuel=input.nextInt();
//输入选择项
if (mesuel==1||mesuel==2)
{
if (parent==null){
System.out.println("不存在父节点,请先设置一下父节点");
}
else {
switch (mesuel) {
//将数据插入到左子树去
case 1:
if (parent.left != null)
{
System.out.println("左子树结点不为空");
}else {
parent.left=pnode;
}
break;
case 2:
if (parent.right != null)
{
System.out.println("右子树结点不为空");
}else {
parent.right=pnode;
}
break;
default:
System.out.println("无效参数");
}
}
}
}while (mesuel!=1&&mesuel!=2);
}
}
//查找结点
private CBType Treefindnode(CBType treenode, String data) {
CBType ptr ;
if (treenode==null)
{
return null;
}
else {
if (treenode.data.equals(data))
{
return treenode;
}else {
if ((ptr=Treefindnode(treenode.left,data))!=null)
{
return ptr;
}else if ((ptr=Treefindnode(treenode.right,data))!=null)
{
return ptr;
}
else
{
return null;
}
}
}
}
//获取左子树
CBType Treefinleft(CBType treenode)
{
if (treenode!=null)
{
return treenode.left;
}else {
return null;
}
}
//获取右子树
CBType Treefindright(CBType treenode)
{
if (treenode!=null)
{
return treenode.right;
}else {
return null;
}
}
//判断空树
int Treefindemptyt(CBType treenode)
{
if (treenode!=null)
{
return 0;
}else {
return 1;
}
}
int Treefinddeep(CBType treenode)
{
if (treenode==null)
{
return 0;
}
else
{
int ldeep=Treefinddeep(treenode.left);
int rdeep=Treefinddeep(treenode.right);
if (ldeep>rdeep)
{
return ldeep+1;
}else
{
return rdeep+1;
}
}
}
void clear(CBType treenode)
{
if (treenode!=null)
{
clear(treenode.left);
clear(treenode.right);
treenode=null;
}
}
//显示结点数据
void Treeshow(CBType p)
{
System.out.printf("%s",p.data);
}
//按层遍历
void ancengbianli(CBType treenode)
{
CBType p;
CBType q[]=new CBType[Maxlen];
int head=0;
int tail=0;
if (treenode!=null)
{
tail=(tail+1)%Maxlen;
q[tail]=treenode;
/**
* 计算循环队列尾序号
* 将二叉树引进队
*/
while (head!=tail)
{
//队列不为空,进行循环
head=(head+1)%Maxlen;
p=q[head];
Treeshow(p);
if (p.left!=null)
{
tail=(tail+1)%Maxlen;
q[tail]=p.left;
}
if (p.right!=null)
{
tail=(tail+1)%Maxlen;
q[tail]=p.right;
}
}
}
}
/**
* 这里面是先序中序和后序遍历的写法
* @param treenode
*/
void xianxubianli(CBType treenode)
{
if (treenode!=null)
{
Treeshow(treenode);
xianxubianli(treenode.left);
xianxubianli(treenode.right);
}
}
void zhongxubianli(CBType treenode)
{
if (treenode!=null)
{
zhongxubianli(treenode.left);
Treeshow(treenode);
zhongxubianli(treenode.right);
}
}
void houxubianli(CBType treenode)
{
if (treenode!=null)
{
zhongxubianli(treenode.left);
zhongxubianli(treenode.right);
Treeshow(treenode);
}
}
}