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实现二叉树的先序、中序、后序、层次遍历,数的最大深度、最大宽度
- 二叉树建立以及先序、中序、后序、层次遍历(JAVA 实现)
- 用非递归实现二叉树的前序、中序、后序、层次遍历,用递归实现查找、统计个数、比较、求深度
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- Java迭代实现二叉树的前序、中序、后序遍历
- 与二叉树有关的一些操作:先序,中序,后序,层次遍历,计算深度,叶结点数
- 二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- 根据二叉树前序遍历和中序遍历的结果,重建出该二叉树并后序遍历之 java代码
- 数据结构——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
- java实现二叉树的先序、中序、后序遍历
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 数据结构(一)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的遍历(Java,前序、中序、后序、递归and非递归)
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- Java实现二叉树的先序、中序、后序、层级遍历