Java 初始化二叉树,先序,中序,后序遍历,深度
来源:互联网 发布:北津学院教务网络管 编辑:程序博客网 时间:2024/06/06 15:41
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); } }}
阅读全文
0 0
- Java 初始化二叉树,先序,中序,后序遍历,深度
- 二叉树创建、先序遍历、中序遍历、后序遍历、树深度
- Java实现二叉树的先序、中序、后序、层次遍历,数的最大深度、最大宽度
- java实现二叉树的先序遍历,中序遍历,后序遍历
- 数据结构--二叉树的创建、先序遍历、中序遍历、后序遍历、深度、叶子结点数
- 二叉树 建立二叉树 二叉树先、中、后序遍历 计算叶结点数 、树的深度
- 二叉树的中序、先序、后序、层序遍历 & 二叉树的深度 & 节点查找
- [C/C++] 先序建立二叉树| 先序、中序、后序遍历二叉树| 求二叉树深度、节点数、叶节点数 算法实现
- 二叉树的遍历(先序、中序、后序)
- 二叉树的先序、中序、后序遍历
- 先序,中序,后序遍历二叉树
- 二叉树 - 先序、中序、后序遍历
- 二叉树的遍历:先序、中序、后序
- 先序,中序,后序,层次遍历二叉树
- 先序、中序、后序遍历二叉树 算法
- 二叉树的先序、中序、后序遍历
- 二叉树的先序、中序、后序遍历
- 二叉树的先序,中序,后序遍历
- 兼容手机的CSS导航栏样式
- 【es6】解构赋值
- 线性表之队列
- 第一次发
- SQL SERVER
- Java 初始化二叉树,先序,中序,后序遍历,深度
- localStorage使用总结
- Selenium2(WebDriver)总结(一)---启动浏览器、设置profile&加载插件
- 汇编学习笔记 第二章
- memcache缓冲池存取数据
- oracle创建scott用户下表的sql语句
- Html静态模拟登陆过程中遇到的问题
- extjs-布局 (在column布局中使用fieldset 和 在fieldset中使用column布局)
- FFmpeg 读取视频流并保存为BMP