線索二叉樹

2021-08-16 21:16:42 字數 1752 閱讀 3607

二叉樹的鏈式儲存如下圖,

不難發現,圖中所示的左—右指標表示中,有一半以上的指標是空的。事實上,所有包括n個結點的二叉樹的這種表示中,每個結點有兩個指標,一共有2n個指標,其中除根結點外,每個結點都被乙個指標所指,所以只有n-1個指標不為空,而另外的n+1和指標為空。

另外,遍歷是二叉樹許多操作的基礎,經常使用,但是一般的遍歷演算法需要大約o(n)的時間代價,如此多次反覆進行遍歷也是時間的嚴重浪費。因此,如果在第一次遍歷時,能夠把遍歷的資訊儲存在二叉樹的空指標中,在重複遍歷二叉樹時就可以利用這些資訊,節省大量的時間,也是空指標得到充分利用。

如何儲存遍歷的資訊?就是對左—右指標表示法的一種修改。利用結點的空的左指標(llink)儲存該結點在某種遍歷序列中的前驅結點的位置;利用結點的空的右指標(rlink)儲存該節點在同種遍歷序列中的後繼節點的位置。這種附加的指向前驅結點和後繼節點的指標稱作線索,這種二叉樹即線索二叉樹。

如何構造線索二叉樹呢?可根據不同的遍歷方法構造不同的線索二叉樹,下面討論中序遍歷構造的二叉樹。為了區分左、右指標和線索,需要對每個結點增加兩個標誌位ltag和rtag,定義如下,

構造線索二叉樹,即是非遞迴遍歷一遍二叉樹,這就需要乙個棧結構,用來儲存遍歷過程中需要回溯的結點的指標。下面演算法中,p指向正在訪問的結點,pre指向它的中序前驅,即上一次剛訪問過的結點,這裡的「訪問」是指把當前結點的左指標和中序前驅結點的右指標改為左線索和右線索。中序線索二叉樹如下,

構造中序線索二叉樹的意義在於,可以方便地從中找到指定結點在中序序列中的前驅和後繼,而不必周遊二叉樹。而且,非遞迴地遍歷二叉樹時,不需要借用棧(需要借用棧的遍歷方法見 ),具體演算法和程式樣例如下,

#include #include #include #include #define maxn 100

#define datatype char

using namespace std;

typedef struct thrtreenode* pthrtreenode;

typedef struct thrtreenode* pthrtree;

struct thrtreenode;

void thread(pthrtree t)

p=s.top(); s.pop();

if(pre)

if(p->llink == null)

}pre = p; p=p->rlink;

}while(!s.empty() || p);

}void threadinorder(pthrtree t) //按中序遍歷周遊中序線索二叉樹

else p=p->rlink; //順線索向下

}}pthrtree createbintree(char seq,int &i,int k)

return null;

}int main()

input:

abc##d##ef#gh##i###
output:
cbdafhgie
上面程式首先構造普通的二叉樹(利用先序序列構建,具體說明 ),

然後,線索化二叉樹,最後按中序遍歷周遊中序線索二叉樹,通過驗證,遍歷的序列正確。

線索二叉樹

當用二叉鍊錶作為二叉樹的儲存結構時,因為每個結點中只有指向其左 右兒子結點的指標,所以從任一結點出發只能直接找到該結點的左 右兒子。在一般情況下靠它無法直接找到該結點在某種遍歷序下的前驅和後繼結點。如果在每個結點中增加指向其前驅和後繼結點的指標,將降低儲存空間的效率。我們可以證明 在n個結點的二叉鍊...

線索二叉樹

1.線索二叉樹結構和操作定義 threadbintree.h 功能 線索標誌域所有值 typedef enumnodeflag 功能 線索二叉樹結構體 typedef struct threadtreethreadbintree 前驅節點指標 threadbintree previous null ...

線索二叉樹

原始碼 中序線索二叉樹 author 菜鳥 version 2014.7.23 include include include typedef char datatype using namespace std 定義線索二叉樹的結構體 typedef struct nodethreadbitreen...