线索二叉树
当用二叉链表来存储二叉树时,每次只能找到左右孩子的信息,不能直接找到其前驱和后继结点的信息。线索二叉树就解决了这个问题。
结点结构图:
LChild Ltag Data Rtag RChild
A.如果有左孩子,则LChild继续指向左孩子,否则,指向该结点的前驱结点。
B.如果有右孩子,则RChild继续指向右孩子,否则,指向该结点的后继结点。
Ltag 用来标记是 左孩子(Ltag = 0)还是 前驱结点 (Ltag = 1)
Rtag 用来标记是 右孩子(Rtag = 0) 还是 后继结点 (Rtag = 1)
线索链表:上面的结点结构组成的二叉树的存储结构
线索:在这种存储结构中,指向前驱和后继结点的指针
线索化:对二叉树以某种次序进行遍历并且加上线索的过程
线索二叉树:线索化的二叉树
说明:画线索二叉树时,实线表示指针,指向其左、右孩子;虚线表示线索,指向其直接前驱或直接后继。
线索二叉树的遍历
var LINK = 0;
var THREAD = 1;
function BinaryThreadTree_inOrder(data, leftChild, rightChild) {
this.data = data;
this.leftChild = leftChild || null;
this.rightChild = rightChild || null;
// 左右标记
this.leftTag = this.rightTag = undefined;
}
BinaryThreadTree_inOrder.prototype = {
constructor: BinaryThreadTree_inOrder,
// 中序线索二叉树的遍历
inOrderTraverse_thread: function (visit) {
var p = this.leftChild;
while (p != this) {
while (p.leftTag === LINK) p = p