算法练习-树结构
来源:互联网 发布:sftp命令 端口 编辑:程序博客网 时间:2024/06/15 11:22
import java.util.Scanner;import org.omg.Messaging.SYNC_WITH_TRANSPORT;class CBTType{ String data; CBTType left; CBTType right;}public class shu { static final int MAXLEN=20; static Scanner sc=new Scanner(System.in); CBTType InitTree(){// 初始化二叉树根 CBTType node; if((node=new CBTType())!= null){ System.out.printf("请先输入一个根结点数据:\n"); node.data=sc.next(); node.left=null; node.right=null; if(node!=null){// 如果二叉树根结点不为空 return node; }else{ return node; } } return null; } public static void main(String[] args) { CBTType root=null;// root为指向二叉树根结点的引用 int menusel; shu t=new shu(); root=t.InitTree(); do{ System.out.printf("请选择菜单添加二叉树的结点"); System.out.println("0.退出"); System.out.println("1.添加二叉树的结点"); menusel=sc.nextInt(); switch (menusel) { case 1: t.AddTreeNode(root); break; case 0: break; default: break; } }while(menusel !=0); do{ System.out.printf("请选择菜单遍历二叉树,输入0表示退出:\n"); System.out.println("1.先序遍历DLR\t"); System.out.println("2.中序遍历LDR"); System.out.println("3.后序遍历LRD"); System.out.println("4.按层遍历\n"); menusel=sc.nextInt(); switch (menusel) { case 0: break; case 1: System.out.println("\n先序遍历DLR的结果"); t.DLRTree(root); System.out.println(); case 2: System.out.println("中序LDR遍历的结果:"); t.LDRTree(root); System.out.println(); case 3: System.out.println("后序遍历lrd的结果"); t.LDRTree(root); System.out.println(); case 4: System.out.println("按层遍历的结果"); t.LevelTree(root); System.out.println(); default: break; } }while(menusel!=0); System.out.printf("二叉树的深度:%d",t.TreeDepth(root)); t.ClearTree(root); root=null; } private void AddTreeNode(CBTType treeNode) { CBTType pnode,parent; String data; int menusel; if((pnode=new CBTType())!=null){ System.out.println("输入二叉树结点数据:"); pnode.data=sc.next(); pnode.left=null; pnode.right=null; System.out.print("输入该结点的父节点数据"); data=sc.next(); parent=TreeFindNode(treeNode,data); if(parent==null){ System.out.print("未找到该结点父节点"); pnode=null; return; } System.out.println("1.添加该结点 到左子树\n2.添加该结点到右子数\n"); do{ menusel=sc.nextInt(); if(menusel==1||menusel==2){ if(parent==null){ System.out.println("不存在父节点,请先设置父节点"); }else{ switch (menusel) { 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("无效参数"); break; } } } }while(menusel!=1&&menusel!=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; } } int TreeIsEmpty(CBTType treeNode){ if(treeNode!=null){ return 0; }else{ return 1; } } 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); } void LevelTree(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; } } } void DLRTree(CBTType treeNode){// 中序遍历 if(treeNode!=null){ TreeNodeData(treeNode); DLRTree(treeNode.left); DLRTree(treeNode.right); } } void LDRTree(CBTType treeNode){ if(treeNode!=null){ LDRTree(treeNode.left); TreeNodeData(treeNode); LDRTree(treeNode.right); } } void LRDTree(CBTType treeNode){ if(treeNode!=null){ LRDTree(treeNode.left); LRDTree(treeNode.right); TreeNodeData(treeNode); } }}
部分截图
阅读全文
0 0
- 算法练习-树结构
- 图结构练习——最小生成树 Prim算法
- 图结构练习——最小生成树 Kruskal算法
- 剑指offer-算法题练习:part19 树的子结构
- 图结构练习——最小生成树(Prim算法)
- 【2144】图结构练习——最小生成树 (prim算法模板) (sdut)
- 图结构练习——最小生成树 (Prim算法)
- 图结构练习——最小生成树--使用并查集算法
- sdut oj2144 图结构练习——最小生成树(普利姆算法)
- 图结构练习——最小生成树(prim算法)
- Dijkstra 算法 sdut acm 2143 图结构练习 ---最短路
- 图结构练习——最短路径 dijkstra算法
- 递归算法练习与整理(一):判断一个二叉树是不是另一个二叉树的的子结构
- 算法练习之二叉树
- 算法笔试-树结构
- 图结构练习-最小生成树
- 【练习】经典算法练习
- 算法练习
- CRM 报表标准权限问题
- ELK+kafka+logback日志采集
- Android手机屏幕坐标定义
- SwipeMenuListView(滑动菜单)-SwipeMenuListView框架完全解析
- MongoDB学习
- 算法练习-树结构
- NavigationView的使用
- Xcode 8 中阶调试技巧
- android每次点击桌面图标应用重启的解决办法
- C语音基础-指针初识15
- 成功的 Git 分支模型
- php7安装zendopcache
- jquery打印插件
- 关于tomcat开机自启