線索二叉樹spa
遍歷二叉樹,實質上是對一個非線性結構進行線性化操做,使得每一個節點在這些線性序列中有且僅有一個直接前驅和直接後驅。.net
線索:指向前驅或後繼節點的指針被稱爲線索。指針
線索二叉樹:加上線索的二叉鏈表就叫作線索二叉樹。blog
實現ci
有n個節點的二叉鏈表一定有n+1個空鏈域。get
推導過程是這樣的:博客
一個擁有n個節點的二叉樹,一定有2n個指針域,也必定有n-1個分支,那麼 2n - (n - 1) 就是空指針域的數量,即:n + 1it
在線索二叉樹的節點中增長兩個標誌域二叉樹
LTag = 0 時 lchild域指示節點的左孩子遍歷
= 1 時 lchild域指示節點的前驅
RTag = 0 時 rchild域指示節點的右孩子
= 1 時 rchild域指示節點的後繼
線索二叉樹遍歷方法:
在線索樹上進行遍歷,只要先找到序列中的第一個節點,而後依次找節點後繼直至其後繼爲空爲止。
當一個二叉樹有了線索以後,就不須要棧信息。對於非葉子節點,也就是分支節點來講,前驅就是其左子樹最後訪問到的數據,後繼是右子樹最早訪問到的一個元素。(中序線索鏈表)
線索二叉樹優勢:
在中序線索二叉樹上遍歷二叉樹,雖然時間複雜度一樣也是O(n),但常數因子要小一些,並且不須要設棧。所以,若在某程序中所用二叉樹須要常常遍歷或查找節點在遍歷說的先行序列中的前驅和後驅,則應採用線索鏈表作存儲結構。
學PHP的小螞蟻 博客 http://my.oschina.net/woshixiaomayi/blog