// 中序遞迴遍歷
void inordertrvdigui(node* pnode)
}
然而,當樹的深度很大(比如16)時(假設為滿二叉樹),樹的節點數為 2^0 + 2^1 + 2^2 + ... + 2^15 = 2^16 = 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉樹的演算法。
非遞迴遍歷二叉樹模擬遞迴呼叫時程式位址的壓棧、出棧操作,必須引入乙個stack儲存結點位址。它的程式執行開銷大大低於遞迴遍歷演算法。
下面列舉出三種非遞迴遍歷二叉樹演算法**。
// **經過除錯成功
#include
#include
#include
#include
using namespace std;
typedef struct tagnodenode;
typedef struct tagtreetree;
// 初始化樹
void inittree(tree* ptree)
ptree->prootnode = pnode[11];
pnode[11]->leftnode = pnode[7];
pnode[11]->rightnode = pnode[16];
pnode[7]->leftnode = pnode[3];
pnode[7]->rightnode = pnode[9];
pnode[3]->leftnode = pnode[0];
pnode[3]->rightnode = pnode[5];
pnode[0]->rightnode = pnode[2];
pnode[2]->leftnode = pnode[1];
pnode[5]->leftnode = pnode[4];
pnode[5]->rightnode = pnode[6];
pnode[9]->leftnode = pnode[8];
pnode[9]->rightnode = pnode[10];
pnode[16]->leftnode = pnode[14];
pnode[16]->rightnode = pnode[19];
pnode[14]->leftnode = pnode[12];
pnode[12]->rightnode = pnode[13];
pnode[14]->rightnode = pnode[15];
pnode[19]->leftnode = pnode[17];
pnode[17]->rightnode = pnode[18];
pnode[19]->rightnode = pnode[21];
pnode[21]->leftnode = pnode[20];
pnode[21]->rightnode = pnode[23];
pnode[23]->leftnode = pnode[22];
}
// 先序非遞迴遍歷
void preordertrv(node* prootnode)
else
}
}
// 中序非遞迴遍歷
void inordertrv(node* prootnode)
else
}
}
// 中序遞迴遍歷
void inordertrvdigui(node* pnode)
}
// 後序非遞迴遍歷
void postordertrv(node* prootnode)
//get the top element of the stack
pnode = nodeptrstack.top();
//如果p沒有右孩子或者其右孩子剛剛被訪問過
if(pnode->rightnode == null || pnode->rightnode == pre)
else
}
}
int _tmain(int argc, _tchar* argv)
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...
二叉樹非遞迴遍歷
二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...
二叉樹非遞迴遍歷
1.先序遍歷 從遞迴說起 void preorder tnode root 遞迴演算法非常的簡單。先訪問跟節點,然後訪問左節點,再訪問右節點。如果不用遞迴,那該怎麼做呢?仔細看一下遞迴程式,就會發現,其實每次都是走樹的左分支 left 直到左子樹為空,然後開始從遞迴的最深處返回,然後開始恢復遞迴現場...