参考链接:
线索二叉树原理及前序、中序线索化(Java版)
原理不细讲了,参考链接里有。
以下图所示的二叉树为例:
中序遍历的结果:
中序遍历的线索二叉树:
虚线箭头为线索指针,对于所有左指针指向空的节点:将该节点的左指针指向该节点在中序遍历中的上一节点;对于所有右指针指向空的节点,将该节点的右指针指向该节点在中序遍历中的下一结点。线索二叉树的中序遍历结果:
即形成了一个特殊的双向链表,之所以特殊,以6–>5为例,6–>5并不是直接到达,而是通过6–>2–>4–>5间接到达。中序遍历的Java实现:
public static class TreeNode { int val; TreeNode left; TreeNode right; boolean isLeftThread; boolean isRightThread; TreeNode(int val) { this.val = val; } } public void inOrder(TreeNode node) { if (node == null) { return; } inOrder(node.left); System.out.println(node.val); inOrder(node.right); }
参考中序遍历的代码,再看线索中序遍历的Java实现:
private TreeNode mPreNode; public void inThreadOrder(TreeNode node) { if (node == null) { return; } inThreadOrder(node.left); if (node.left == null) { node.left = mPreNode; node.isLeftThread = true; } if (mPreNode != null && mPreNode.right == null) { mPreNode.right = node; mPreNode.isRightThread = true; } mPreNode = node; inThreadOrder(node.right); }