国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

c++二叉樹(shù)的幾種遍歷算法

2020-01-26 16:22:08
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1. 前序/中序/后序遍歷(遞歸實(shí)現(xiàn))

復(fù)制代碼 代碼如下:

// 前序遍歷
void BT_PreOrder(BiTreePtr pNode){
if (!pNode)  return;   
visit(pNode);  
BT_PreOrder(pNode->left);
BT_PreOrder(pNode->right);   }
// 中序遍歷
void BT_PreOrder(BiTreePtr pNode){ 
if (!pNode)  return;    
BT_PreOrder(pNode->left);  
visit(pNode);  
BT_PreOrder(pNode->right);}
// 后序遍歷void BT_PreOrder(BiTreePtr pNode){   
if (!pNode)  return;      
BT_PreOrder(pNode->left);  
BT_PreOrder(pNode->right);   
visit(pNode);}

2. 前序遍歷(非遞歸實(shí)現(xiàn))
復(fù)制代碼 代碼如下:

// 用棧實(shí)現(xiàn)
void BT_PreOrderNoRec1(BiTreePtr pNode){
stack<BiTreePtr> s;
while (!pNode || !s.empty()) 
{      
if (!pNode) 
{           
visit(pNode);   
s.push(pNode);       
pNode = pNode->left;  
}      
else      
{          
pNode = s.pop();
pNode = pNode->right;    

}
}
// 用棧實(shí)現(xiàn)
void BT_PreOrderNoRec2(BiTreePtr pNode){
if (!pNode)  
{      
stack<BiTreePtr> s; 
s.push(pNode);     
while (!s.empty())  
{          
BiTreePtr pvNode = s.pop();
visit(pvNode);         
s.push(pvNode->right);      
s.push(pvNode->left);  
}  
}}
//
不用棧實(shí)現(xiàn) 每個(gè)節(jié)點(diǎn)含父節(jié)點(diǎn)指針和isVisited【默認(rèn)為false】狀態(tài)變量 且該二叉樹(shù)含一個(gè)頭節(jié)點(diǎn)
void BT_PreOrderNoRec3(BiTreePtr pNode){   
while (!pNode)
// 回溯到指向根節(jié)點(diǎn)的頭節(jié)點(diǎn)時(shí)退出 
{       
if( !pNode->bVisited )
// 判定是否已被訪(fǎng)問(wèn)   
{             
visit(pNode);   
pNode->isVisited = true;  
}       
if ( pNode->left && !pNode->left->isVisited )    
pNode = pNode->left;     
else if( pNode->right && !pNode->right->isVisited ) 
pNode = pNode->right;      
else  
//回溯    
pNode = pNode->parent; 
}}

3. 中序遍歷(非遞歸實(shí)現(xiàn))

復(fù)制代碼 代碼如下:

// 用棧實(shí)現(xiàn)
void BT_InOrderNoRec1(BiTreePtr pNode){
stack<BiTreePtr> s;
while (!pNode || !s.empty())  
{      
if (!pNode)      
{         
s.push(pNode);      
pNode = pNode->left;   
}  
else  
{       
pNode = s.pop(); 
visit(pNode);      
pNode = pNode->right;

}}
// 不用棧實(shí)現(xiàn) 每個(gè)節(jié)點(diǎn)含父節(jié)點(diǎn)指針和isVisited【默認(rèn)為false】的狀態(tài)變量 且該二叉樹(shù)含一個(gè)頭節(jié)點(diǎn)
void BT_InOrderNoRec2(BiTreePtr pNode){   
while (!pNode)
// 回溯到指向根節(jié)點(diǎn)的頭節(jié)點(diǎn)時(shí)退出
{     
while (pNode->left && !pNode->left->isVisited)      
pNode = pNode->left;     
if (!pNode->isVisited)      
{         
visit(pNode);   
pNode->isVisited=true;  
}     
if (pNode->right && !pNode->right->isVisited) 
pNode = pNode->right;  
else         
pNode = pNode->parent;
}}

4. 后序遍歷(非遞歸實(shí)現(xiàn))
復(fù)制代碼 代碼如下:

void BT_PostOrderNoRec(BiTreePtr pNode){
if(!pNode) return;
stack<BiTreePtr> s;
s.push(pNode); 
while (!s.empty())  
{    
BiTreePtr pvNode = s.pop(); 
if (pvNode->isPushed)
// 表示其左右子樹(shù)都已入棧,訪(fǎng)問(wèn)該節(jié)點(diǎn)      
visit(pvNode);   
else    
{       
if (pvNode->right) 
{             
pvNode->right->isPushed = false;
S.push(pvNode->right);         
}          
if (pvNode->left)    
{              
pvNode->left->isPushed = false;  
s.push(pvNode->left);         
}         
pvNode->isPushed = true;     
s.push(pvNode);   
}  
}}

5. 層序遍歷(使用隊(duì)列)

復(fù)制代碼 代碼如下:

void BT_LevelOrder(BiTreePtr pNode){
if (!pNode) return;  
queue<BiTreePtr> q;  
q.push(pNode); 
BiTreePtr pvNode;
while (!q.empty())
{     
pvNode = q.pop();    
visit(pvNode);  
if (pvNode->left)
q.push(pvNode->left); 
if (pvNode->right)   
q.push(pvNode->right);  
}}

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鹰潭市| 图木舒克市| 色达县| 安康市| 平塘县| 扎赉特旗| 土默特右旗| 莒南县| 太仓市| 大关县| 海伦市| 浮梁县| 洛阳市| 宣威市| 斗六市| 逊克县| 汤原县| 辽中县| 宜章县| 三门峡市| 晴隆县| 淮南市| 武强县| 大英县| 海门市| 栖霞市| 融水| 梁山县| 嘉祥县| 汤原县| 班玛县| 壶关县| 嘉禾县| 阳信县| 崇明县| 昌都县| 奉贤区| 沛县| 明水县| 黄平县| 绵阳市|