二叉樹(shù)的非遞歸遍歷
第一章:介紹在這篇文章中,我們將討論二叉樹(shù)的非遞歸遍歷。首先,讓我們了解算法的背景和實(shí)驗(yàn)內(nèi)容。第二章:算法規(guī)范(1) 前序遍歷:前序遍歷是指在處理子節(jié)點(diǎn)之前先處理節(jié)點(diǎn)本身。代碼如下:```// 前序遍
第一章:介紹
在這篇文章中,我們將討論二叉樹(shù)的非遞歸遍歷。首先,讓我們了解算法的背景和實(shí)驗(yàn)內(nèi)容。
第二章:算法規(guī)范
(1) 前序遍歷:
前序遍歷是指在處理子節(jié)點(diǎn)之前先處理節(jié)點(diǎn)本身。代碼如下:
```
// 前序遍歷
void preorderTraversal(TreeNode* root) {
stack
TreeNode* node root;
while (!s.empty() || node ! NULL) {
if (node ! NULL) {
// 處理節(jié)點(diǎn)
cout << node->val << " ";
s.push(node);
node node->left;
} else {
node ();
s.pop();
node node->right;
}
}
}
```
(2) 中序遍歷:
中序遍歷是指在處理左右子節(jié)點(diǎn)之間先處理節(jié)點(diǎn)本身。代碼如下:
```
// 中序遍歷
void inorderTraversal(TreeNode* root) {
stack
TreeNode* node root;
while (!s.empty() || node ! NULL) {
if (node ! NULL) {
s.push(node);
node node->left;
} else {
node ();
s.pop();
// 處理節(jié)點(diǎn)
cout << node->val << " ";
node node->right;
}
}
}
```
(3) 后序遍歷:
后序遍歷是指在處理子節(jié)點(diǎn)之后才處理節(jié)點(diǎn)本身。代碼如下:
```
// 后序遍歷
void postorderTraversal(TreeNode* root) {
stack
TreeNode* node root;
s1.push(node);
while (!s1.empty()) {
node ();
s1.pop();
s2.push(node);
if (node->left ! NULL) {
s1.push(node->left);
}
if (node->right ! NULL) {
s1.push(node->right);
}
}
while (!s2.empty()) {
node ();
s2.pop();
// 處理節(jié)點(diǎn)
cout << node->val << " ";
}
}
```
第三章:源代碼(C語(yǔ)言)
第四章:測(cè)試結(jié)果
測(cè)試一:
測(cè)試目的:使用普通二叉樹(shù)驗(yàn)證程序的正確性。
預(yù)期結(jié)果:(前序遍歷)A B D G C E F ,(中序遍歷)D G B A E C F,(后序遍歷)G D B E F C A
程序?qū)嶋H運(yùn)行結(jié)果:
測(cè)試二:
測(cè)試目的:使用完全二叉樹(shù)驗(yàn)證程序的正確性。
預(yù)期結(jié)果:(前序遍歷)A B D E C F,(中序遍歷)D B E F C,(后序遍歷)D E B F C A
程序?qū)嶋H運(yùn)行結(jié)果:
測(cè)試三:
測(cè)試目的:使用滿二叉樹(shù)驗(yàn)證程序的正確性。
預(yù)期結(jié)果:(前序遍歷)A B D E C F G,(中序遍歷)D B E A F C G,(后序遍歷)D E B F G C A
程序?qū)嶋H運(yùn)行結(jié)果:
第五章:分析和評(píng)論
通過(guò)對(duì)二叉樹(shù)的非遞歸遍歷實(shí)現(xiàn),每個(gè)節(jié)點(diǎn)只需要遍歷一次,所以算法的時(shí)間復(fù)雜度為O(n)。對(duì)于進(jìn)一步可能的改進(jìn),也許可以嘗試使用兩個(gè)棧來(lái)實(shí)現(xiàn)后序遍歷。