Kubernetes持久化存储:PV与PVC实战指南
2026/7/24 9:58:08
普通二叉树大量节点的left/right指针会为空,n 个节点的二叉树有 n+1 个空指针域,线索二叉树就是把这些空指针利用起来:
leftTag:0 = 左孩子,1 = 左前驱线索rightTag:0 = 右孩子,1 = 右后继线索prepre,leftTag=1pre.rightTag=1pre = 当前节点pre要作为成员变量,递归全程共享前驱状态rightTag:是线索直接跳后继;是孩子就找右子树最左节点java
运行
/** * 线索二叉树节点 */ class ThreadNode { int val; ThreadNode left; ThreadNode right; // 0:指向左右孩子;1:指向前驱/后继线索 int leftTag; int rightTag; public ThreadNode(int val) { this.val = val; } } /** * 中序线索二叉树实现 */ public class ThreadBinaryTree { // 线索化时记录上一个访问的前驱节点 private ThreadNode pre; public ThreadNode root; /** * 中序线索化主方法 */ public void inOrderThread() { pre = null; inOrderThreadRecursion(root); } /** * 递归完成中序线索化 * 流程:左子树线索化 → 处理当前节点线索 → 更新前驱 → 右子树线索化 */ private void inOrderThreadRecursion(ThreadNode node) { if (node == null) { return; } // 1.先线索化左子树 inOrderThreadRecursion(node.left); // 2.处理当前节点的左线索:左孩子为空,指向前驱pre if (node.left == null) { node.left = pre; node.leftTag = 1; } // 3.处理前驱节点的右线索:前驱右孩子为空,后继指向当前node if (pre != null && pre.right == null) { pre.right = node; pre.rightTag = 1; } // 更新前驱为当前节点,供下一轮使用 pre = node; // 4.线索化右子树 inOrderThreadRecursion(node.right); } /** * 线索二叉树中序遍历(无需栈/递归,利用线索遍历) */ public void threadInOrderList() { ThreadNode cur = root; while (cur != null) { // 第一步:找到中序第一个节点:一路向左找leftTag=0的最左节点 while (cur.leftTag == 0) { cur = cur.left; } // 输出当前节点 System.out.print(cur.val + " "); // 通过右线索不断找后继 while (cur.rightTag == 1) { cur = cur.right; System.out.print(cur.val + " "); } // rightTag=0说明是右孩子,切换到右子树继续循环 cur = cur.right; } } public static void main(String[] args) { // 构建题目中的二叉树结构 ThreadNode node1 = new ThreadNode(1); ThreadNode node3 = new ThreadNode(3); ThreadNode node8 = new ThreadNode(8); ThreadNode node10 = new ThreadNode(10); ThreadNode node6 = new ThreadNode(6); ThreadNode node14 = new ThreadNode(14); // 建立父子关系 node1.left = node3; node1.right = node6; node3.left = node8; node3.right = node10; node6.right = node14; ThreadBinaryTree tree = new ThreadBinaryTree(); tree.root = node1; // 执行中序线索化 tree.inOrderThread(); System.out.println("线索化后中序遍历结果:"); // 理论结果:8 3 10 1 6 14 tree.threadInOrderList(); } }ThreadNodeleftTag/rightTag:标记指针类型,是线索还是孩子leftTag=rightTag=0,默认都是孩子指针inOrderThreadRecursionleftTag=1rightTag=1pre=node,把当前节点设为下一个节点的前驱threadInOrderListwhile:找到中序起始节点(最左节点)rightTag=1),直接顺着线索取后继输出plaintext
线索化后中序遍历结果: 8 3 10 1 6 14和你之前二叉树中序遍历结果完全一致,验证线索化正确。