线索化二叉树的中序构建及遍历
1 线索化的引入
如上图所示,中序遍历的结果相信大家都能写出来,关键是在每一次形成二叉树的时候,你会发现 n 个节点有2n个指针,但是能利用到的只有n-1,因为每一个节点(除了root)节点外,有且仅有一个指针指向当前节点。剩余 2n- (n-1)= n+1个指针未被利用。因此我们的目标就是利用这N+1个节点
2 线索化的思路(中序)
一个未被线索化,或者说还有空余节点的,一定是倒数的两层。最后一层的所有节点都没有被利用。倒数第二层比如图中6就右边没有被利用。因此我们的思路是首先写出中序遍历的顺序。在本案例中是 8 3 10 1 14 6 然后根据这个序列进行。
对于节点的左边,如果为空,那么就指向前驱节点或者左子树
对于节点的右边,如果为空,那么就指向后继节点或者右子树
迭代的时候自然是先一路朝左开进,碰到null就返回,然后进行设置,具体代码及分析如下
class Node{
private int no;
private String name;
private Node left;
private Node right;
private int leftType;
private int rightType;
}
上面的是节点的定义
class ThreadThree {
private Node root;
private Node pre = null;
public void threadedNodes(Node node) {
if (node == null) {
return;
}
threadedNodes(node.getLeft())