線索化二叉樹

2021-08-21 03:07:57 字數 4169 閱讀 4940

線索化概念

當某節點的左指標為空時,令該指標指向按照某種方式遍歷二叉樹時得到該節點的前驅結點;當某節點的右指標為空時,令該指標指向按照某種方式遍歷二叉樹時得到該節點的後繼結點。

但是無法區分:

因此需要增加兩個線索標誌位來區分這兩種情況:

leftthread(左線索):

rightthread(右線索)

結點中指向前驅結點和後繼結點的指標稱為線索,二叉樹結點加上線索的二叉樹稱為線索二叉樹,對二叉樹以某種方式(前序、中序、後續)遍歷使其變為線索二叉樹的過程稱為按照該方法對二叉樹進行線索化。

線索化二叉樹

//執行效率

//空間占用

//**簡單

#include

typedef

char threadtype;

//定義乙個列舉型別用來表示某一節點的左右指標是子樹還是線索

typedef

enum flagflag;

typedef

struct threadnodethreadnode;

threadnode* threadtreecreate(threadtype array, size_t size, threadtype invalid);

void prethreading(threadnode* root); //先序線索

void preorderbythreading(threadnode* root); //先序遍歷

void inthreading(threadnode* root); //中序線索

void inorderbythreading(threadnode* root); //中序遍歷

void postthreading(threadnode* root); //後序線索

void postorderbythreading(threadnode* root); //後序遍歷

typedef

struct treenodetreenode;

threadtree.c

#include "threadtree.h"

#include

#include

threadnode* createthreadnode(threadtype value)

// abd##eg###c#f##

threadnode* _threadtreecreate(threadtype array, size_t size, size_t* index, threadtype invalid)

if(array[*index] == invalid)

threadnode* root = createthreadnode(array[*index]);

++(*index);

root->left = _threadtreecreate(array, size, index, invalid);

++(*index);

root->right = _threadtreecreate(array, size, index, invalid);

return root;

}// 輸入的array是二叉樹的先序遍歷結果(帶有空指標域)

// abd##eg###c#f##

// invalid表示用哪個特殊字元表示空節點。此處使用#

threadnode* threadtreecreate(threadtype array, size_t size, threadtype invalid)

void _prethreading(threadnode* root, threadnode** prev)

//處理根節點

//1.如果當前子樹的根節點的左子樹為空,就把 left 指標指向前驅

if(root->left == null)

//2.如果當前子樹的根節點的前驅的右子樹為空,就把前驅的 right 指標指向根節點

if(*prev != null && (*prev)->right == null)

*prev = root;

//處理左子樹

if(root->lflag == child)

//處理右子樹

if(root->rflag == child)

return;

}void prethreading(threadnode* root)

void preorderbythreading(threadnode* root)

threadnode* cur = root;

while(cur != null)

printf("%c ", cur->data);

//無論 cur 的 right 指標指向後繼還是指向右子樹,都被下面的邏輯覆蓋到了

cur = cur->right;

}printf("\n");

return;

}void _inthreading(threadnode* root, threadnode** prev)

//處理左子樹

if(root->lflag == child)

//處理根節點

if(root->left == null)

if(*prev != null && (*prev)->right == null)

*prev = root;

//處理右子樹

if(root->rflag == child)

}void inthreading(threadnode* root)

void inorderbythreading(threadnode* root)

threadnode* cur = root;

//當迴圈結束,cur就指向了這棵樹的最左側節點

while(cur != null && cur->lflag == child)

//2.進入迴圈,訪問cur結點,如果cur節點為空,說明遍歷完了

while(cur != null)else}}

printf("\n");

return;

}void _postthreading(threadnode* root, threadnode** prev)

//處理左子樹

if(root->lflag == child)

//處理右子樹

if(root->rflag == child)

//處理根節點

if(root->left == null)

if(*prev != null && (*prev)->right == null)

*prev = root;

}void postthreading(threadnode* root)

void _preorderconverttolist(treenode* root, treenode** prev)

//處理根節點

root->prev = *prev;

if(*prev != null)

*prev = root;

//處理左子樹

_preorderconverttolist(root->left, prev);

//處理右子樹

_preorderconverttolist(root->right, prev);

}void preorderconverttolist(treenode* root)

線索化二叉樹以及遍歷線索化二叉樹

1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...

線索化二叉樹

define crt secure no warnings 1 includeusing namespace std enum pointertag 列舉 其結構如下 void prevorderthreading 前序 void postorderthreading 後序 void inorder...

線索化二叉樹

二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊.二叉樹的結...