您可以使用threaded tree执行此操作。以下是该方法的概述(摘自here - 见幻灯片31):
- 后序:创建一个以root为后代的虚拟节点。
- 变量可用于检查当前操作的类型。
- 如果操作是遍历,当前节点有左后代,则后代
遍历了。否则,操作会更改为正确的遍历。
- 如果操作是正确遍历且当前节点具有左后代,则操作已更改
离开遍历。否则操作已更改为访问节点。
- 如果操作正在访问节点:访问当前节点,之后是其后订单后继节点
必须找到。
- 如果当前节点的父节点可通过线程访问(即当前节点是父节点
left child)然后将遍历设置为继续使用父级的右后代。
- 如果当前节点没有正确的后代,则这是右扩展链的末尾
节点。
- 首先:通过当前节点的线程到达链的开头。
- 第二:链中节点的右引用相反。
- 最后:向后扫描链,访问每个节点,然后右对齐
恢复到之前的设置。
如上所述,如果对树结构使用临时修改,也可以在没有线程的情况下完成。