您的位置:首页 > 编程语言 > Java开发

Java 初始化二叉树,先序,中序,后序遍历,深度

2017-06-10 17:09 1391 查看
import java.util.Scanner;

//定义二叉树结点类型
class CBTType
{
String data;//元素数据
CBTType left;
CBTType right;
}
class Main {
static final int MAXLEN = 20;
static Scanner input = new Scanner(System.in);
CBTType InitTree() //初始化二叉树的根
{
CBTType node = null;
if ( (node = new CBTType()) != null )
{
System.out.printf("请先输入一个根结点数据: \n");
node.data = input.next();
node.left = null;
node.right = null;
//          return node;
}
return node;
}

//添加结点
void AddTreeNode( CBTType treeNode )
{
CBTType pnode, parent;
String data;
int menuse1;

if ( (pnode = new CBTType()) != null )
{
System.out.printf("输入二叉树结点数据:\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("未找到该父节点!\n");
pnode = null;//释放创建的结点内容
return;
}
System.out.println("1.添加该结点到左子树");
System.out.println("2.添加该结点到右子树");
do {
menuse1 = input.nextInt();
if (menuse1 == 1 || menuse1 == 2)
{
if (parent == null)
{
System.out.println("不存在父节点,请先设置父节点!");
}
else
{
switch(menuse1)
{
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 (menuse1 != 1 & menuse1 != 2);
}
}

private CBTType TreeFindNode(CBTType treeNode, String data ) {
CBTType 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;
}
}
}

CBTType TreeLeftNode(CBTType treeNode)
{
if ( treeNode != null )
{
return treeNode.left;
}
else return null;
}
CBTType TreeRightNode(CBTType treeNode)
{
if (treeNode != null)
{
return treeNode.right;
}
else return null;
}
//判断是否为空
boolean TreeIsEmpty(CBTType treeNode)
{
if (treeNode != null)
{
return false;
}
else
{
return true;
}
}
//计算二叉树的的深度
int TreeDepth(CBTType treeNode)
{
int depleft, depright;
if (treeNode == null)
{
return 0;
}
else
{
depleft = TreeDepth(treeNode.left);
depright = TreeDepth(treeNode.right);
if (depleft > depright)
{
return depleft + 1;
}
else
{
return depright + 1;
}
}
}
//清空二叉树
void ClearTree(CBTType treeNode)
{
if (treeNode != null)
{
ClearTree(treeNode.left);
ClearTree(treeNode.right);
treeNode = null;
}
}
//显示结点数据
void TreeNodeData(CBTType p)
{
System.out.printf("%s", p.data);
}

public static void main(String[] args)
{
CBTType root = null;
int menuse1;
Main t = new Main();
//设置根元素
root = t.InitTree();
//添加结点
do {
System.out.println("请选择菜单添加二叉树的结点\n");
System.out.println("0.退出\t");//显示菜单
System.out.println("1.添加二叉树的结点\n");
menuse1=input.nextInt();
switch( menuse1 )
{
case 1:
t.AddTreeNode(root);
break;
case 0: break;
default: break;
}
} while (menuse1 != 0);

//遍历
do {
System.out.println("请选择遍历二叉树,输入0表示退出: ");
System.out.println("1.先序遍历");
System.out.println("2.中序遍历");
System.out.println("3.后序遍历");
System.out.println("4.按层遍历");
menuse1 = input.nextInt();
switch( menuse1 )
{
case 0: break;
case 1: //
System.out.println("先序遍历PreTraversalTree的结果是: ");
t.PreTraversalTree(root);
System.out.println();
break;
case 2:
System.out.println("中序遍历的结果是;");
t.InTraversalTree(root);
System.out.println();
break;
case 3:
System.out.println("后序遍历的结果是: ");
t.PostTraversalTree(root);
System.out.println();
break;
case 4:
System.out.println("按层遍历的结果是: ");
t.LevelTraversalTree(root);
System.out.println();
break;
default:break;
}
}while ( menuse1 != 0 );
//深度
System.out.println("二叉树深度为: %d" + t.TreeDepth(root));
//清空二叉树
t.ClearTree(root);
root = null;
}
//层序遍历
private void LevelTraversalTree(CBTType treeNode) {
CBTType p;
CBTType[] q = new CBTType[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];
TreeNodeData(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;
}
}
}
//后序遍历
private void PostTraversalTree(CBTType root) {
if ( root != null )
{
PostTraversalTree(root.left);
PostTraversalTree(root.right);
TreeNodeData(root);
}
}
//前序遍历
private void PreTraversalTree(CBTType root) {
if ( root != null )
{
TreeNodeData(root);
PreTraversalTree(root.left);
PreTraversalTree(root.right);
}
}
//中序遍历
private void InTraversalTree(CBTType root) {
if ( root != null )
{
InTraversalTree(root.left);
TreeNodeData(root);
InTraversalTree(root.right);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 二叉树 遍历
相关文章推荐