線索化二叉樹,顧名思義,跟「線索」二字有關。一般的,n各結點的二叉鍊錶共有2n個鏈域,非空鏈域為n-1個,但其中的空鏈域卻有n+1個,造成了儲存空間的浪費,因此,我們設想利用原來的空鏈域存放指標,指向樹中其他結點。這種指標稱為線索。原來的二叉鍊錶就變成了下圖結構:
(一)結構體定義
class bintree;
建立線索也有一定的規則:(考慮中序遍歷)
(1)如果ptree->lchild為空,則存放指向中序遍歷序列中該結點的前驅結點。這個結點稱為ptree的中序前驅;
(2)如果ptree->rchild為空,則存放指向中序遍歷序列中該結點的後繼結點。這個結點稱為ptree的中序後繼;
當然,二叉樹的線索化是為了方便遍歷的,因此要記得和雙向鍊錶結點一樣,在二叉樹鍊錶上新增一 個頭結點,如下圖所示,並令其leftchild域的指標指向二叉樹的根結點(),其rightchild域的指標指向中序遍歷訪問時的最後乙個結點()。反之,令二叉樹的中序序列中第乙個結點中,leftchild域指標和最後乙個結點的rightchild域指標均指向頭結點()。這樣我們既可以從第乙個結點起順後繼進行遍歷,也可以從最後乙個結點起順前驅進行遍歷。
(二)完整測試**
#include#include#include#includeusing namespace std;
class bintree;
bintree *pre; //用來記錄上乙個節點,即當前節點的前驅,當前節點為pre的後繼
bintree *find(bintree *root,char in_data)
}bintree *createtree()
parent=find(root,in_string[2]); //返回第一次出現的位置
if(in_string[4]-'0'==1)else if(in_string[4]-'0'==2)
if(getchar()=='\n')
break;
} return root;
}//編寫中序線索化過程的函式,再新增頭結點的
bintree *inthreading(bintree *root)
//因為要線索化當前節點的後繼不方便,所以用pre記錄節點t的前乙個節點
//可以確定t為pre的後繼,那麼,每次都是確定當前節點的前驅和該節點的上乙個節點pre的後繼
if(pre->rightchild==null)
pre=t; //把當前節點p賦值給pre,以便下次利用
//!!!
inthreading(t->rightchild); //線索化右子樹
} return root;
}//通過新增頭結點的方式將其線索化
bintree *addheadthread(bintree *root,bintree *head)else
}//中序遍歷
void inorder(bintree *head)
t=t->rightchild;//進入右子樹
} }int main()
測試**輸入:
輸入為多個空格分隔開的a(x,y)
字母代表插入的節點名
x為當前該節點的父節點
y=0代表為根節點、1為左孩子、2為右孩子
如果對二叉樹有疑問:二叉樹的儲存與基本操作實現
參考:中序線索二叉樹建立及其遍歷
線索化二叉樹以及遍歷線索化二叉樹
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...
線索化二叉樹
二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊.二叉樹的結...