国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 怀柔区| 彝良县| 芒康县| 兴和县| 梧州市| 沾化县| 偃师市| 桂东县| 海门市| 普安县| 蓬安县| 金山区| 宝应县| 开封县| 富源县| 当涂县| 浑源县| 乌海市| 济阳县| 樟树市| 民县| 石台县| 嫩江县| 金溪县| 卓尼县| 沿河| 拉孜县| 广德县| 永川市| 辽阳县| 温宿县| 伊通| 开原市| 大安市| 连城县| 潍坊市| 凌源市| 资源县| 东丽区| 金湖县| 新余市|