线索化二叉树
public void infixThrNodes(TreeNode node){
if (node == null){
return;
}
infixThrNodes(node.lChild);
if (node.lChild == null){
node.lType = 1;
node.lChild = pre;
}
if (pre != null && pre.rChild == null){
pre.rType = 1;
pre.rChild = node;
}
pre = node;
infixThrNodes(node.rChild);
}
- 思路:
- 程序开始后执行,因为是中序遍历,开始递归,直接走到最深层的左节点。
- 然后判断当前节点是否有左子孩子。没有则将当前节点的前驱节点赋给左孩子(node.lChild = pre),并将左子节点类型变为1
(0表示孩子节点,1表示前驱或后驱节点)
(我们需要提前定义一个变量用于存储之前遍历过的前驱节点。因为node节点每次都会向下走。一旦走过之后就无法获取到前驱节点了,所有我们需要一个变量存储前驱节点)
- 下面程序继续执行,我们这时需要判断前驱节点的孩子节点是否为空
(因为我们只定义了两个节点,只有前驱和根节点,而没有后驱节点。所以必须等到本应该是根节点的node走到后驱节点位置上。这时pre节点就会走到根节点位置,这样我们就有根节点后驱节点)。
- pre不等于null是避免空指针异常(第一次pre是空,),以及当pre等于null时也代表二叉树已经遍历完毕,走到了最后一个节点
- 然后让将当前遍历到的节点赋给pre(pre = node)
二叉树线索化遍历
public void infixShow(TreeNode node){
TreeNode point = node.lChild;
while (point != node) {
while (point.lType == 0) {
point = point.lChild;
}
System.out.println(point);
while (point != node && point.rType == 1) {
point = point.rChild;
System.out.println(point);
}
point = point.rChild;
}
}
- 思路:先定义一个变量将node节点存储。因为我们最后要进行比较判断。所有需要一个临时指针
- 外层一个循环不停遍历二叉树,直到point指针与传入节点相同时,代表已经遍历结束
- 内层第一个循环当type为1时结束循环,并打印节点。
- 第二个循环当type为2时结束循环并打印节点
- 每次point向下走一次