二叉樹線索化以及線索化前序 中序 後序遍歷

2021-08-11 18:24:19 字數 2620 閱讀 2861

二叉樹線索化以及線索化前序、中序、後序遍歷

前面已經對二叉樹的建立與建立有了一定了解,那二叉樹的線索化又是什麼呢?

二叉樹雖然是非線性結構,但二叉樹的遍歷卻為二叉樹的節點匯出了乙個線性序列。

用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。

為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊

利用二叉樹中的空指標域來存放在某種遍歷次序下的前驅和後繼

,這種指標叫「線索」。這種加上了線索的二叉樹稱為線索二叉樹。

根據線索的性質的不同,線索二叉樹分為:前序線索二叉樹 , 中序線索二叉樹 , 後序線索二叉樹

節點結構如下:

enum pointertag;

templatestruct bintreenodetread

bintreenodetread* _pleft;

bintreenodetread* _pright;

pointertag _leftthread; // 左線索

pointertag _rightthread; // 右線索

t _data;

};

_leftthread標記是否有左子樹,值為link表示有左孩子,值為thread表示沒有左孩子,則有前驅;

_rightthread標記是否有右子樹,值為link表示有右孩子,值為thread表示沒有右孩子,則有後繼;

一、要線索化二叉樹,首先我們要建立二叉樹。

//建立二叉樹

void _createbintree(pnode& proot, const t* array, size_t size, size_t& index, const t& invalid)

}

二、前序線索化二叉樹

先來看一下圖:

// 前序線索化二叉樹:根節點--->左子樹--->右子樹 

void _prethreading(pnode proot, pnode& prev)

if (prev != null&&prev->_pright == null)// 上乙個節點有沒有右子樹 

prev = proot; //前驅,每次記住上次的節點  

//判斷root是否有左右孩子  

if (proot->_leftthread == link)

_prethreading(proot->_pleft, prev);

if (proot->_rightthread == link)

_prethreading(proot->_pright, prev);

}

前序線索二叉樹遍歷

//前序遍歷二叉樹遞迴

void _preorder(pnode proot)

//前序遍歷二叉樹非遞迴

void _preordernor(pnode proot)

cout << pcur->_data << " ";

pcur = pcur->_pright;

} }

三、中序線索二叉樹

// 中序:左子樹--->根節點--->右子樹 

void _inthreading(pnode proot, pnode& prev)

if (prev&&prev->_pright == null) //沒有右孩子

prev = proot;

if (proot->_rightthread == link)

_inthreading(proot->_pright, prev);//線索化右子樹  

}

中序線索二叉樹遍歷:

//中序遍歷二叉樹遞迴

void _inorder(pnode proot)

//中序遍歷二叉樹非遞迴

void _inordernor(pnode proot)

cout << pcur->_data << " ";

while (pcur->_rightthread == thread)

cout << pcur->_data << " ";

}if (pcur != null)}}

四、後序線索二叉樹

線索化:

// 後序:左子樹--->右子樹--->根節點 

void _postthreading(pnode proot, pnode& prev)

if (prev != null&&prev->_pright == null) //沒有右孩子

prev = proot;

}

後序線索化遍歷:

線索化二叉樹(前序線索化,中序線索化)

為什麼要對二叉樹進行線索化?對二叉樹進行遍歷是以一定的規則將二叉樹的節點排列成乙個線性序列,這些線性序列有且僅有乙個直接前驅和直接後繼,但是以二叉鍊錶進行儲存的時候,只能找到節點的左右孩子資訊,不能直接得到節點在任一串行的前驅和後繼資訊,前驅和後繼資訊只能在遍歷的動態過程中才能得到。如何獲取到前驅和...

二叉樹線索化

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

二叉樹線索化

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