Java创建/遍历二叉树

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);//后序遍历	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值