畅享高效体验:手把手教你玩转Gemini3与Nano Banana Pro
2025/12/18 1:05:28
二叉排序树(也叫二叉搜索树)是一种基于 “左小右大” 规则的有序二叉树
特点:
lChild:左子节点引用data:节点存储的数据rChild:右子节点引用package com.qcby.Tree; public class TreeNode { public TreeNode lChild; // 左子节点 public TreeNode rChild; // 右子节点 public Integer data; // 节点数据 // 构造方法:初始化节点数据 public TreeNode(Integer data) { this.data = data; } }包括创建(插入节点)、遍历、查询
插入节点的逻辑遵循 “左小右大” 的规则,步骤如下:
root == null),新节点直接作为根节点;package com.qcby.Tree; import java.util.LinkedList; public class BinaryTree { TreeNode root; // 二叉树根节点 // 向二叉排序树插入节点 public void create(Integer value) { TreeNode newNode = new TreeNode(value); // 情况1:树为空,新节点作为根 if (root == null) { root = newNode; return; } // 情况2:树非空,循环查找插入位置 TreeNode curNode = root; while (true) { if (curNode.data < newNode.data) { // 新节点更大,走右子树 if (curNode.rChild == null) { curNode.rChild = newNode; return; } curNode = curNode.rChild; } else { // 新节点更小/相等,走左子树 if (curNode.lChild == null) { curNode.lChild = newNode; return; } curNode = curNode.lChild; } } } }二叉排序树支持 4 种常见遍历方式,分别对应不同的访问顺序:
// 先序遍历 public void beforeOrder(TreeNode node) { if (node == null) { return; } System.out.print(node.data + " "); // 访问根 beforeOrder(node.lChild); // 遍历左子树 beforeOrder(node.rChild); // 遍历右子树 }二叉排序树的中序遍历结果是升序序列
// 中序遍历 public void inOrder(TreeNode node) { if (node == null) { return; } inOrder(node.lChild); // 遍历左子树 System.out.print(node.data + " "); // 访问根 inOrder(node.rChild); // 遍历右子树 }// 后序遍历 public void afterOrder(TreeNode node) { if (node == null) { return; } afterOrder(node.lChild); // 遍历左子树 afterOrder(node.rChild); // 遍历右子树 System.out.print(node.data + " "); // 访问根 }通过队列实现,依次访问每一层的节点:
// 层次遍历 public void levelOrder(TreeNode root) { if (root == null) { return; } LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); System.out.print(node.data + " "); // 访问当前节点 if (node.lChild != null) { queue.add(node.lChild); // 左子节点入队 } if (node.rChild != null) { queue.add(node.rChild); // 右子节点入队 } } }利用 “左小右大” 的特性,递归查找目标节点:
// 递归查询指定节点 public TreeNode find(TreeNode root, Integer data) { if (root == null) { // 节点为空,未找到 return null; } if (root.data.equals(data)) { // 找到目标节点 return root; } if (root.data < data) { // 目标值更大,查右子树 return find(root.rChild, data); } else { // 目标值更小,查左子树 return find(root.lChild, data); } }