二叉樹線索化及其遍歷方法

2021-08-15 20:36:31 字數 2770 閱讀 7386

#include

#include

#include

#include

typedef

char datatype;

typedef

enum pointflag;

typedef

struct bintreenode

node, *pnode;

void initbintree(pnode proot)

pnode buynode(datatype data)

//二叉樹建立

void _createbintree(pnode* proot, datatype array, int size, int* index, datatype invalid)

}void createbintree(pnode* proot, datatype array, int size, datatype invalid)

//前序線索化

void _preorderthd(pnode proot, pnode* prev)

if ((*prev) && null == (*prev)->_pright)//2.處理前乙個結點的右指標域

(*prev) = proot;//3.更新 *prev

if (proot->_leftthread == link)//4.線索化當前指標的左子樹

_preorderthd(proot->_pleft, prev);

if (proot->_rightthread == link)//5.線索化當前指標的右子樹

_preorderthd(proot->_pright, prev);

}}void preorderthd(pnode proot)

//中序線索化

void _inorderthd(pnode proot, pnode* prev)

//3.處理前乙個結點的右指標域

if ((*prev) && null == (*prev)->_pright)

//4.更新前乙個結點

(*prev) = proot;

//5.線索化當前指標的右子樹

if(proot->_rightthread == link)

_inorderthd(proot->_pright, prev);

}}void inorderthd(pnode proot)

//後續線索化

void _postorderthd(pnode proot, pnode* prev)

if ((*prev) && null == (*prev)->_pright)//處理前乙個結點的右指標域

(*prev) = proot;//更新前乙個結點指向下乙個

}}void postorderthd(pnode proot)

//前序遞迴遍歷

void preorderd(pnode proot)

}//線索化前序遍歷

void preorder(pnode proot)

printf("%c ", pcur->_data);

pcur = pcur->_pright;

}}//中序遞迴遍歷

void inorderd(pnode proot)

}//線索化中序遍歷

void inorder(pnode proot)

//當且結點的左子樹已處理完畢

printf("%c ", pcur->_data);//處理當前結點

while (pcur->_rightthread == thread)//開始處理後續結點,轉移到右子樹(訪問**一起的後續結點)

pcur = pcur->_pright;//開始處理當前結點的右子樹

}}//後續遞迴遍歷

void postorderd(pnode proot)

}//線索化後續遍歷

void postorder(pnode proot)

if (pcur == proot && (null == pcur->_pright || prev == pcur->_pright))//根節點

while (pcur && pcur->_pright == prev)//訪問當前結點

if (pcur && pcur->_rightthread == link)//開始訪問右子樹

}}int main()

; pnode proot = null;

createbintree(&proot, array, sizeof(array) / sizeof(array[0]), '#');

//前序線索化

preorderd(proot);

printf("\n");

preorderthd(proot);

preorder(proot);

printf("\n");

//中序線索化

//inorderd(proot);

//printf("\n");

//inorderthd(proot);

//inorder(proot);

//printf("\n");

//後續線索化

//postorderd(proot);

//printf("\n");

//postorderthd(proot);

//postorder(proot);

//printf("\n");

system("pause");

return

0;}

二叉樹線索化

二叉樹的線索化可以使得二叉樹的非遞迴遍歷不需借助棧或佇列這種資料結構,最主要的是可以為之提供迭代器。線索化二叉樹有三種方式 前序線索化 中序線索化 後序線索化 後序線索化需要三叉鏈結構 這裡主要講前序線索化和中序線索化,並為中序線索化提供迭代器。線索化的思想就是將一顆二叉樹遍歷轉換成有序雙向鍊錶進行...

二叉樹線索化

名稱 二叉樹線索化 說明 這個東西,一開始弄起來,我去,感覺老複雜了。照著書上看了好久,愣是沒看懂,照著敲了一遍,又手動模擬推了一遍,有了一點思路。照著把後序的線索化和遍歷也敲出來了。這裡要注意的是 對於中序來說,其能線索化後訪問到其前驅和後繼 可以理解為不通過棧訪問到 而對於後序來說,其只能不通過...

二叉樹線索化

public void infixthrnodes treenode node infixthrnodes node.lchild if node.lchild null if pre null pre.rchild null pre node infixthrnodes node.rchild 0...