Java创建/遍历二叉树

来源:互联网 发布:万得资讯软件 编辑:程序博客网 时间:2024/05/29 02:49
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;}elsereturn 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("左子树结点不为空!");elseparent.left=pnode;}else if(menusel==2){if (parent.right!=null)out.println("右子树结点不为空!");elseparent.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);//后序遍历}}

0 0