c語言實現線索二叉樹的建立,線索化以及遍歷

2021-08-07 16:37:10 字數 1569 閱讀 9123

結構與函式

typedef

struct threadnodethreadnode, * threadtree;

threadtree initthreadtree();

void inthread(threadtree p,threadtree pre); //通過中序遍歷對二叉樹線索化

void createinthread(threadtree t); //通過中序遍歷建立中序二叉樹

threadtree firstnode(threadtree p); //求中序遍歷下的第乙個節點

threadtree nextnode(threadtree p); //求節點p在中序序列下的後乙個節點

void visit(threadtree t);

void inorder(threadtree t); //中序遍歷

線索二叉樹的初始化

threadtree initthreadtree()

return

t;}

線索二叉樹的線索化

/* * 首先如果根節點的lchild為null,那麼根節點的lchild為pre為null

* 第二個if的時候,pre不為null的時候才執行,第一次是不執行的

* 根節點的左孩子線索完畢之後,pre就指向了根節點了,然後遞迴

* 遞迴之後,指標pre每次都會指向剛剛訪問過的節點

* 中序遍歷,如果左孩子不為空,就會一直繼續處理左孩子知道左孩子為空,然後處理右孩子

*/

void inthread(threadtree p,threadtree pre)

if(pre !=

null

&& pre->rchild ==

null)

pre = p; //p剛剛訪問過了,則pre = p

inthread(p->rchild, pre); //遞迴,優化右子樹

}}void createinthread(threadtree t)

}

線索二叉樹的遍歷

threadtree firstnode(threadtree p)

threadtree nextnode(threadtree p)

void visit(threadtree t)

void inorder(threadtree t)

firstnode是中序遍歷下面的第乙個訪問的節點

nextnode是這個結點在中序遍歷下面訪問的下乙個節點

如果有右子樹的鏈結,則下乙個節點就是rchild

如果沒有,表示存在右子樹,由中序遍歷的遞迴思想,下乙個節點就相當於以這個結點的右節點為根節點在中序遍歷下面的首節點

nextnode = firstnode(p->rchild);

用C語言實現線索二叉樹

為什麼會有線索二叉樹?當以二叉鍊錶形式來儲存二叉樹時,只能找到節點的左右子樹資訊,而不能直接得到節點的前驅和後繼資訊 只有通過遍歷,在動態過程中才能查到前驅和後繼的資訊 因此就有了線索二叉樹,由二叉樹的性質可知,一棵具有 n 個節點的二叉樹,對應的二叉鍊錶中共有 2n 個指標域,其中 n 1 個用於...

(C )二叉樹的線索化 線索二叉樹

線索化標誌tag enum pointertag 結點結構 template struct binarytreenodethd 基類迭代器 template struct binarytreeiterator t operator t operator bool operator const sel...

C 線索二叉樹

using system namespace bithrtree class bithrtree else 線索化二叉樹 static btnode pre,h static public void threading ref btnode t static public void thread r...