#pragma once
#include
#include
using
namespace
std;
enum nodeflag ;
template
struct binarytreenodethd
t _data;//資料域
binarytreenodethd* _parents;//雙親指標
binarytreenodethd* _pleftchild;//左孩子指標
nodeflag _leftflag;//左孩子指標的標記
binarytreenodethd* _prightchild;//右孩子指標
nodeflag _rightflag;//右孩子指標的標記
};template
class binarytreethd
binarytreethd(const t* arr, size_t size, const t& invalid)//使用陣列內的資料構造二叉樹
void prethread()
void preorderthd()
cout
<< pcur->_data << " ";//訪問最左節點
pcur = pcur->_prightchild;//將最左節點的右孩子當做乙個新的子樹處理
}cout
<< endl << endl;
}void inthread()
void inorderthd()
pcur = pcur->_prightchild;/*上述while判斷的當前節點的右標記不是thread,即沒有被線索化,
所以將其右子樹當做新子樹重新開始訪問*/
}cout
<< endl << endl;
}void postthread()
void postorderthd()
if (pcur == _proot)//判斷是否根節點,放置左、右單支子樹
while(pcur && ppre == pcur->_prightchild)/*當前節點的孩子節點已訪問過
(因為線索化後右孩子指向孩子,未線索化右孩子指向右孩子)
即是判斷上一節點是否訪問過,訪問過則尋找雙親節點*/
if (pcur && link == pcur->_rightflag)//經過以上,已將子樹的左子樹訪問完畢,開始訪問子樹的右子樹
pcur = pcur->_prightchild;
}cout
<< endl << endl;
}private:
void _createtree(node*& proot, const t* arr, size_t size, size_t& index, const t& invalid)// 建立樹
}void _prethread(node*& proot, node*& ppre)
if (ppre && null == ppre->_prightchild)//若ppre存在,且ppre的右孩子不存在,將ppre的右孩子線索化,指向孩子節點
ppre = proot;//更新ppre節點
if (proot->_leftflag == link)//若當前節點的左孩子的左標記為沒有線索化,才遞迴
_prethread(proot->_pleftchild, ppre);
if(proot->_rightflag == link)//若當前節點的右孩子的右標記為沒有線索化,才遞迴
_prethread(proot->_prightchild, ppre);
}void _inthread(node*& proot, node*& ppre)
if (ppre && null == ppre->_prightchild)//若ppre存在,且ppre的右孩子不存在,將ppre的右孩子線索化,指向孩子節點
ppre = proot;//更新ppre節點
if (proot->_rightflag == link)//若當前節點的右孩子的右標記為沒有線索化,才遞迴
_inthread(proot->_prightchild, ppre);
}void _postthread(node*& proot, node*& ppre)
if (ppre && null == ppre->_prightchild)//若ppre存在,且ppre的右孩子不存在,將ppre的右孩子線索化,指向孩子節點
ppre = proot;//更新ppre節點
}};void funtest()
線索二叉樹的建立和遍歷
基本概念 對於n個結點的二叉樹,在二叉鏈儲存結構中有n 1個空鏈域,利用這些空鏈域存放在某種遍歷次序下該結點的前驅結點和後繼結點的指標,這些指標稱為線索,加上線索的二叉樹稱為線索二叉樹,這種加上了線索的二叉鍊錶稱為線索鍊錶。根據線索性質的不同,線索二叉樹可分為前序線索二叉樹 中序線索二叉樹和後序線索...
詳解 前 中 後序線索化二叉樹及其遍歷
前序線索化二叉樹是在二叉樹前序遍歷的過程中對其進行線索化,將葉子節點和單分支節點的指標域線索化成其前驅和後繼,利用遞迴的特點,並且定義兩個節點指標,乙個在前乙個在後,在中序遍歷的過程中通過這兩個前後指標建立前驅後繼的連線關係。實現 前序線索化二叉樹 void prethbinarytree btth...
二叉樹的前中後序遍歷
秋招記錄 對一棵二叉樹進行遍歷,我們可以採取3種順序進行遍歷,分別是前序遍歷 中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是n,左節點是l,右節點是r,那麼對應的訪問遍歷順序如下 前序遍歷 中左右 n l r 中序遍歷 左中右 l n r 後序遍歷 左右中 l r n ...