一、基础概念
二叉树是一种树形结构,每个节点至多拥有两个子节点,分别被称为左子节点和右子节点,可以为空。
通常将子节点比节点小的节点称为“左孩子”,将子节点比节点大的节点称为“右孩子”,这种关系称为“有向边”。
二叉树的常见定义:二叉树是n(n>=0)个节点的有限集合,该集合或空集合可能为空。当集合不为空时,它由一个根节点和两个互不相交的子集合,分别是根节点的左子树和右子树组成。
二、二叉树的特点
1、每个节点至多拥有两个子节点。
2、左子节点永远比右子节点先被操作。
3、二叉树可以是空树,即没有节点,此时根节点为null。
4、二叉树的深度是从根节点到最远叶节点的路径长度,空树的深度为0。
5、二叉树的层数是从根节点到叶节点的路径数,空树的层数为0。
三、二叉树的遍历
遍历,指的是按照某种规则依次访问二叉树中的每一个节点。常见的方法有三种:
1、前序遍历(pre-order):先访问根节点,再访问左子树,最后访问右子树。
2、中序遍历(in-order):先访问左子树,再访问根节点,最后访问右子树。
3、后序遍历(post-order):先访问左子树,再访问右子树,最后访问根节点。
四、二叉树的实现
二叉树的实现可以使用链表和数组两种方式,链表实现更常用。以下是链表实现的代码示例:
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } class BinaryTree { TreeNode root; public void preOrder(TreeNode root) { if (root != null) { System.out.print(root.val + " "); preOrder(root.left); preOrder(root.right); } } public void inOrder(TreeNode root) { if (root != null) { inOrder(root.left); System.out.print(root.val + " "); inOrder(root.right); } } public void postOrder(TreeNode root) { if (root != null) { postOrder(root.left); postOrder(root.right); System.out.print(root.val + " "); } } }
五、二叉树的应用
1、二叉查找树(BST):通过比较当前节点的值和目标值的大小,可以快速定位目标值,能够高效地进行插入、删除、查找等操作。
2、最小生成树:Kruskal(克鲁斯卡尔)算法和Prim(普里姆)算法都用到了二叉树的概念。
3、表达式树:通过建立表达式树,可以用二叉树来表示数学表达式并进行计算。
六、总结
二叉树是一种常用的树形数据结构,每个节点最多有两个子节点,左子节点永远比右子节点先被操作。它可以通过三种方式进行遍历,即前序、中序、后序遍历。二叉树的应用非常广泛,比如用于二叉查找树、最小生成树和表达式树中。