数据结构-->二叉树
来源:互联网 发布:淘宝宝贝图片素材 编辑:程序博客网 时间:2024/06/07 06:29
package 树结构;
import java.util.Scanner;
public class TreeType {
static final int MAXLEN = 20;static Scanner sc = new Scanner(System.in);/* 初始化二叉树的根 */SB init() { SB node; if ((node = new SB()) != null) { // 申请内存 System.out.println("请先输入一个根节点数据"); node.data = sc.next(); node.left = null; node.right = null; if (node != null) { // 如果二叉树的根节点不为空 return node; } else { return null; } } return null;}void TreeAdd(SB treeNode) { SB Pnode, Pparent; String data; int menu; if ((Pnode = new SB()) != null) {// 分配内存 System.out.println("输入二叉树节点数据"); Pnode.left = null;// 设置左右子树为空 Pnode.right = null; System.out.println("输入该节点父节点的数据"); data = sc.next(); Pparent = TreeFindNode(treeNode, data);// 查找指定数据的节点 if (Pparent == null) { System.out.println("未找到该父节点"); Pnode = null;// 释放节点的数据内存 return; } System.out.printf("1.添加该节点到左子树\n2.添加该节点到左子树\n"); do { menu = sc.nextInt();// 输入选择项 if (menu == 1 || menu == 2) { if (Pparent == null) { System.out.println("不存在父节点,请先设置父节点"); } else { switch (menu) { case 1:// 添加到左节点 if (Pparent.left != null) {// 左子树不为空 System.out.printf("左子树节点不为 空\n"); } else { Pparent.left = Pnode; } break; case 2:// 添加到右节点 if (Pparent.right != null) {// 右子树不为空 System.out.println("右子树节点不为空"); } else { Pparent.right = Pnode; } break; default: System.out.printf("无效参数\n"); } } } } while (menu != 1 && menu != 2); }}/* 查找节点 */SB TreeFindNode(SB treeNode, String data) { SB prt; if (treeNode == null) { return null; } else { if (treeNode.data.equals(data)) { return treeNode; } else { // 分别向左右子树递归查找 if ((prt = TreeFindNode(treeNode.left, data)) != null) { return prt; } else if ((prt = TreeFindNode(treeNode.right, data)) != null) { return prt; } else { return null; } } }}/* 获取左子树 */SB getTreeLeft(SB treeNode) { if (treeNode != null) { return treeNode.left;// 返回值 } else { return null; }}/* 获取右子树 */SB getTreeRight(SB treeNode) { if (treeNode != null) { return treeNode.right;// 返回值 } else { return null; }}/* 判断空树 */int TreeEmpty(SB treeNode) { if (treeNode != null) { return 1; } return 0;}/* 计算二叉树的深度 */public int TreeDepth(SB treeNode) { int depleft; int depright; if (treeNode == null) {// 对于空树,深度为0 return 0; } else { // 左子树深度(递归调用) // 右子树深度(递归调用) depleft = TreeDepth(treeNode.left); depright = TreeDepth(treeNode.right); if (depleft > depright) { return depleft + 1; } else { return depright + 1; } }}/* 清空二叉树 */void TreeClean(SB treeNode) { if (treeNode != null) { TreeClean(treeNode.left);// 清空左子树 TreeClean(treeNode.right);// 清空右子树 treeNode = null;// 释放当前节点内存 }}/* 显示节点数据 */void TreeNodeData(SB p) { System.out.printf("%s", p.data);}/* 二叉树层序遍历 */void Treelevel(SB treeNode) { SB p; SB[] sb = new SB[MAXLEN];// 定义一个顺序栈 int head = 0, tail = 0; if (treeNode != null) {// 如果队首引用不为空 tail = (tail + 1) % MAXLEN;// 计算循环队列的队尾序号 sb[tail] = treeNode;// 将二叉树头引用进队 } while (head != tail) {// 队列不为空进行循环 head = (head + 1) % MAXLEN;// 计算循环队列的队首序号 p = sb[head];// 获取对手元素 TreeNodeData(p);// 处理队首元素 if (p.left != null) {// 如果节点存在左子树 tail = (tail + 1) % MAXLEN;// 计算循环队列的队尾序号 sb[tail] = p.left;// 将二叉树左子树进队 } if (p.right != null) { tail = (tail + 1) % MAXLEN;// 计算循环队列的队尾序号 sb[tail] = p.right;// 将二叉树右子树进队 } }}/* 先序遍历 */void Treedlr(SB treeNode) { if (treeNode != null) { TreeNodeData(treeNode);// 显示节点数据 Treedlr(treeNode.left); Treedlr(treeNode.right); }}/* 中序遍历 */void TreeCentre(SB treeNode) { if (treeNode != null) { TreeCentre(treeNode.left); TreeNodeData(treeNode);// 显示节点数据 TreeCentre(treeNode.right); }}/* 后序遍历 */void TreeAfter(SB treeNode) { if (treeNode != null) { TreeAfter(treeNode.left); TreeAfter(treeNode.right); TreeNodeData(treeNode);// 显示节点数据 }}public static void main(String[] args) { SB root;// 指向二叉树的引用 int menu; TreeType type = new TreeType(); root = type.init();// 设置根节点 /* 添加节点 */ do { System.out.println("请选择菜单添加二叉树的节点"); System.out.printf("0.退出\t"); System.out.println("1.添加二叉树的节点"); menu = sc.nextInt(); switch (menu) { case 1: type.TreeAdd(root); break; case 0: break; default: ; } } while (menu != 0); /* 遍历节点 */ do { System.out.println("请选择菜单遍历二叉树的节点"); System.out.println("1.层序遍历"); System.out.println("2.先序遍历"); System.out.println("3.中序遍历"); System.out.println("4.后序遍历"); menu = sc.nextInt(); switch (menu) { case 0: break; case 1: System.out.printf("层序遍历的结果为"); type.Treelevel(root); System.out.printf("\n"); break; case 2: System.out.printf("先序遍历的结果为"); type.Treedlr(root); System.out.printf("\n"); break; case 3: System.out.printf("中序遍历的结果为"); type.TreeCentre(root); System.out.printf("\n"); break; case 4: System.out.printf("后序遍历的结果为"); type.TreeAfter(root); System.out.printf("\n"); break; default: ; } } while (menu != 0); // 深度 System.out.printf("二叉树深度为:%d\n", type.TreeDepth(root)); type.TreeClean(root);// 清空二叉树 root = null;}
}
class SB {
String data;// 元素数据
SB left;// 左子树
SB right;// 右子数
}
阅读全文
0 0
- 数据结构-树-二叉树
- 数据结构::树,二叉树
- 数据结构-二叉树
- 二叉树的数据结构
- 数据结构-二叉树算法
- java数据结构:二叉树
- 数据结构---二叉树
- 数据结构(C++)--二叉树
- JAVA 数据结构 二叉树
- 数据结构-二叉树 问题
- 转贴:数据结构:二叉树
- 二叉树(数据结构 c++)
- 数据结构-二叉树操作
- java数据结构----二叉树
- 数据结构二叉树
- 数据结构中的二叉树
- 数据结构--二叉树
- 数据结构二叉搜索树
- JavaWeb: jsp
- android动画--translate
- http tcp/ip socket
- #HDU1695#GCD(容斥 + 分解质因数)
- ARM裸机开发入门(一)
- 数据结构-->二叉树
- jzoj 3450_山峰_bfs
- NetMQ学习一
- day_01至day_02
- 822C Hacker, pack your bags!
- 剑指offer——机器人的运动范围(还行)
- Android ListView实现滑动删除
- Android开发之sqlite
- 插入排序(INSERTION-SORT)