線索二叉樹的線索化演算法

鍾超發表於2009-11-14

在嚴蔚敏的《資料結構》一書中,所使用的程式碼存在一些小問題。原版程式碼就不附上了,主要問題是:

1.InThreading函式的引數,應該攜帶pre,這應該是比較嚴重的問題。如果沒有攜帶pre,則對pre的修改只是在呼叫的函式中的區域性變數的值的修改,沒有影響到原來的pre的值。

2.在條件語句中,將命中概率高的語句放在前面,會提高程式碼效率。但嚴的演算法中在InOrderThreading演算法中,將T為NULL時放在了前面。

3.InOrderThreading中,只有T為NULL時,執行Thrt->rchild = Thrt才有意義。而在T不為NULL時,要執行Thrt->rchild = pre,即使開始執行了Thrt->rchild = Thrt,也會被覆蓋掉,所以把Thrt->rchild = Thrt句移到了else分句中。

Status InOrderThreading(BiTree Thrt, BiTree T) { Thrt->LTag = Link; Thrt->RTag = Thread; if(T) { Thrt->lchild = T; pre = Thrt; InThreading(T, pre); pre->RTag = Thread; pre->rchild = Thrt; Thrt->rchild = pre; } else { Thrt->lchild = T; Thrt->rchild = Thrt; } }

void InTreading(BiTree p, BiTree pre) { if(p) { InThreading(p->lchild, pre); if(!p->lchild) { p->LTag = Thread; p->lchild = pre; } if(!pre->rchild) { pre->RTag = Thread; p->rchild = p; } pre = p; InThreading(p->rchild, pre); } }

歡迎討論、批評與指正!

ALex ZhonG

相關文章