1 简介
深度优先的二叉树遍历方法有先序, 中序和后序. 那么一棵有n个节点的树, 其一共会存储2n个指针, 但是因为只有n - 1条边, 所以只有n - 1个指针会被存储, 剩下的n + 1都会存为nullptr, 那么可以把所有的空指针利用起来. 其中如果某个节点的左子节点为空的话, 可以按照当前遍历方式(先序, 中序, 后序)存储其前驱结点, 右子节点为空的话, 可以存储后继节点.
2 结构
普通的二叉树节点的结构为:
struct TreeNode {int val;TreeNode* left;TreeNode* right;
};
如果想将二叉树线索化的话, 其空左节点会被赋值为其前驱结点, 空右节点会被赋值为其后继节点, 这样在遍历二叉树的时候, 就不知道其left, right指针到底指向的是其左右子节点还是其前驱后继节点了. 所以需要有一个标志位来判定当前左右子节点指向的是什么. 所以其结构变成了:
struct TreeNode {int val;TreeNode* left;bool leftTag; //表明现在指向的是左子节点还是前驱结点TreeNode* right;bool rightTag; //表明现在指向的是右子节点还是后继节点
};