線索二叉樹就是在通用的二叉樹裡多了點東西,多了什麼呢? 前驅和後繼,把二叉樹變成一個鏈式的結構。解釋下:通常我們的二叉樹裡,葉子節點是沒有孩子,所以指向空也就是NULL
,在線索二叉樹裡,葉子節點的左右孩子分別指向它自己的前驅和後繼,而前驅和後繼是哪個節點呢?
就是樹遍歷過程的前一個節點和後一個節點。所以第一個遍歷的節點是沒有前驅的,最後一個節點是沒有後繼的。這裡一般都是中序線索二叉樹,當然也有先序線索二叉樹和後序線索二叉樹。
[]a[]
/ \
[]b[] []c[]
/ \
[]d[] []e[]
上面是一個二叉樹,我在每個節點兩邊都添加了一個標簽[]
這個標簽裡面我暫時還沒添內容,裡面只有兩種值,一個是0
一個是1
,當節點有孩子節點的時候,為0
,沒有孩子的時候為1
。
所以節點的結構體為:
typedef struct TreeNode* node; struct TreeNode{ node lchild; int ltag; int rtag; node rchild; int data; };
當為0
的時候,指向孩子節點,為1
的時候指向前驅或者後繼。
下面附上代碼。
代碼如下:
node Pre = NULL; void InOrderTree(node n){ if (n == NULL) { }else{ // Pre = n; if (n->lchild != NULL) { n->ltag = 0; InOrderTree(n->lchild); }else{ n->ltag = 1; n->lchild = Pre; } if (Pre!=NULL && Pre->rchild == NULL) { Pre->rtag = 1; Pre->rchild = n; } Pre = n; if (n->rchild != NULL) { n->rtag = 0; InOrderTree(n->rchild); }else{ n->rtag = 1; } } }
int main(int argc, const char * argv[]) { node head = (node)malloc(sizeof(struct TreeNode)); head->data = 1; node node1 = (node)malloc(sizeof(struct TreeNode)); node node2 = (node)malloc(sizeof(struct TreeNode)); node node3 = (node)malloc(sizeof(struct TreeNode)); node node4 = (node)malloc(sizeof(struct TreeNode)); node1->data = 2; node2->data = 3; node3->data = 4; node4->data = 5; head->lchild = node1; head->rchild = node2; node1->lchild = node3; node1->rchild = node4; node2->lchild = NULL; node2->rchild = NULL; node3->lchild = NULL; node3->rchild = NULL; node4->lchild = NULL; node4->rchild = NULL; InOrderTree(head); return 0; }