当前位置: 首页 > news >正文

【二叉树】java源码实现

BiTree 是 Binary Tree 的缩写,中文意思是 二叉树

Node.java

public class Node<T> {public T data;public Node<T> left;public Node<T> right;public Node(T data, Node<T> left, Node<T> right) {this.data = data;this.left = left;this.right = right;}public Node(T data) {this.data = data;}public Node(Node<T> left, Node<T> right) {this.left = left;this.right = right;}public Node() {}
}

BiTree.java

public class BiTree<T> {public Node<T> root;public BiTree() {}public BiTree(Node<T> root) {this.root = root;}public BiTree(T data, Node<T> lp , Node<T> rp) {this.root = new Node<T>(data,lp,rp);}public boolean isEmpty() {return root == null;}public Node<T> getRoot() {return root;}public Node<T> getLeft(Node<T> p) {return p.left;}public Node<T> getRight(Node<T> p) {return p.right;}public void insertL(T val,Node<T> p) {Node<T> tmp = new Node<T>(val);tmp.left = p.left;p.left = tmp;}public void insertR(T val,Node<T> p) {Node<T> tmp = new Node<T>(val);tmp.right = p.right;p.right = tmp;}public Node<T> deleteL(Node<T> p) {if ((p==null) || (p.left == null)) {return null;}Node<T> tmp = p.left;tmp.left = null;return tmp;}public Node<T> deleteR(Node<T> p) {if ((p==null) || (p.right == null)) {return null;}Node<T> tmp = p.right;tmp.right = null;return tmp;}public boolean isLeaf(Node<T> p) {if ((p != null) && (p.left == null) && (p.right == null)){return true;}else{return false;}}
//    前序public void preOrder(Node<T> root) {if (root == null) {return;}System.out.println(root.data);preOrder(root.left);preOrder(root.right);}
//    中序遍历public void inOrder(Node<T> root) {if (root == null) {return;}inOrder(root.left);System.out.println(root.data);inOrder(root.right);}
//    后序遍历public void postOrder(Node<T> root) {if (root == null) {return;}postOrder(root.left);postOrder(root.right);System.out.println(root.data);}
//    深度public int getDepth(Node<T> root) {if (root == null) {return 0;}int leftDepth = getDepth(root.left);int rightDepth = getDepth(root.right);return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;}public void getParent(Node<T> cur, Node<T> target) {if (cur == null) {return;}if (cur.left == target || cur.right == target) {System.out.println(cur.data);return;}getParent(cur.left, target);getParent(cur.right, target);}public int countNode(Node<T> p){if (p == null) {return 0;}return 1+countNode(p.left)+countNode(p.right);}public int countleaves(Node<T> p){if (p == null) {return 0;}if (isLeaf(p)) {return 1;}return countleaves(p.left)+countleaves(p.right);}
}

练习:

BiTreeMain.java

public class BiTreeMain {public static void main(String[] args) {// 创建根节点(根节点为 'A')Node<Character> root = new Node<Character>('A');BiTree<Character> tree = new BiTree<Character>(root);// 插入左孩子 'B' 和右孩子 'C'tree.insertL('B', root);tree.insertR('C', root);// 获取左右孩子节点Node<Character> leftChild = tree.getLeft(root); // 'B'Node<Character> rightChild = tree.getRight(root); // 'C'// 继续插入节点tree.insertL('D', leftChild);  // 'B' 的左孩子是 'D'tree.insertR('E', leftChild);  // 'B' 的右孩子是 'E'tree.insertL('F', rightChild); // 'C' 的左孩子是 'F'tree.insertR('G', rightChild); // 'C' 的右孩子是 'G'System.out.println("前序遍历:");tree.preOrder(root); // A, B, D, E, C, F, GSystem.out.println("\n中序遍历:");tree.inOrder(root); // D, B, E, A, F, C, GSystem.out.println("\n后序遍历:");tree.postOrder(root); // D, E, B, F, G, C, ASystem.out.println("\n树的深度:");System.out.println(tree.getDepth(root)); // 3//        输出所有节点数System.out.println("\n树的节点个数:");System.out.println(tree.countNode(root));
//        输出所有叶子节点System.out.println("\n树的树叶节点个数:");System.out.println(tree.countleaves(root));}
}

http://www.xdnf.cn/news/256843.html

相关文章:

  • 安装了新版本的python解释器,但在命令行窗口使用`--version`无法查看版本信息
  • C++ 项目中的多语言字符串管理方案(支持自动提示与动态加载)
  • 数字智慧方案5874丨智慧交通收费稽核管理体系的构建与思考(44页PPT)(文末有下载方式)
  • Qt C++简单图形界面与绘图实验
  • 实现水平垂直居中的多种方法
  • 随机微分方程(SDE):股票价格模型、利率模型的构建
  • 【AI面试准备】传统测试工程师Prompt Engineering转型指南
  • 多种尝试解决Pycharm无法粘贴外部文本【本人问题已解决】
  • 第二届平航杯wp
  • 【Linux】线程同步与互斥
  • Vite 工具链
  • 变转速振动信号分析处理与故障诊断算法模块
  • 数字智慧方案6197丨智慧用电一体化服务运营解决方案(34页PPT)(文末有下载方式)
  • linux进程的复制和替换
  • map和set的遗留 + AVL树(1):
  • 架构师面试(三十七):监控系统架构模式
  • 新手学编程前端好还是后端
  • React useMemo函数
  • C语言 之【队列的简介、队列的实现(初始化、销毁、入队、出队、判空、元素个数、元素的访问)】
  • n8n 安装 n8n-nodes-mcp 社区节点
  • 对解微分方程分离变量法本质的思考
  • nt!NtReplyWaitReceivePortEx函数分析之nt!LpcpMoveMessage拷贝csr_api_msg
  • 【数据结构】单链表的增删查改
  • 微软发布了最新的开源推理模型套件“Phi-4-Reasoning
  • 构建更快,部署更智能:立即优化您的 Docker 设置
  • CPO-BP+NSGA,豪冠猪优化BP神经网络+多目标遗传算法!(Matlab完整源码和数据)
  • 如何掌握 Lustre/Scade 同步数据流语言
  • BERT+CRF模型在命名实体识别(NER)任务中的应用
  • 自主机器人模拟系统
  • Flutter - 概览