線索二叉樹的構造
阿新 • • 發佈:2020-08-06
首先明確線索二叉樹的概念,線索二叉樹是原本二叉樹n個節點中未分配的n-1個孩子指標改為線索指標,左孩子指向前驅結點,右孩子指向後繼節點。
中序線索二叉樹的構造就要明確中序遍歷:
#include<iostream> using namespace std; struct BiTree{ int date; BiTree*lchild,*rchild; int ltag,rtag;//如果左孩子是線索則ltag為1 }; void visit(BiTree*t){//visit函式 cout<<t->date; } void InOrder(BiTree*T){//中序遍歷 if(T){ InOrder(T->lchild); visit(T); InOrder(T->rchild); } }
以上程式碼將輸入中序遍歷的序列,修改新增以下程式碼:
void InOrder(BiTree*&T,BiTree*&pre){//既然要修改指標的指向,那就一定要用指標的引用 if(T){ InOrder(T->lchild,pre); if(T->lchild==NULL)//表示指向左子樹的指標沒有使用,可以用於指向前驅結點{ T->lchild=pre;//改為指向其前驅結點 T->ltag=1; } if(pre!=NULL&&pre->rchild==NULL){ pre->rchild=T; pre->rtag=1; } pre=T; visit(T); InOrder(T->rchild,pre); } }
函式只是對沒有使用的指標做了修改,結果仍然輸出的是中序序列,所以函式對二叉樹的線索化也是沿著中序遍歷的順序進行的。同理可以寫出先序遍歷和後序遍歷的線索化。
注意:對於最後一個節點,並沒有對其線索化,在主函式中要單獨修改。