把遞迴轉成非遞迴的基本思想是用棧保留臨時狀態。對於先序遍歷很簡單,對於中序和後序遍歷要稍微麻煩點。
分析中序的過程:對於當前節點,如果有左子樹,說明不是當前應該訪問的節點,應該入棧然後考察其左子樹,否則就在出棧的過程中訪問該節點。如果訪問了當前節點後,其有右子樹,則應該訪問其右子樹後,再訪問其父節點,因此要優先考察右節點。
分析後序的過程:對於當前節點,如果有左子樹,同中序。如果出棧後沒有右子樹,則訪問。如果有右子樹,則不能出棧,並且訪問右子樹,等到再次在出棧的過程中發現這個節點就訪問。
#include#include#include#includeusing namespace std;
typedef struct treenodetreenode;
bool error = false;
treenode* precreate()
node->data = data;
node->left = precreate();
node->right = precreate();
return node;
}void midsearch(treenode *root)
while(!stac.empty())
} }}void postsearch(treenode *root)
while(!stac.empty())
}} }
}void treefeidigui_foo()
前序 中序 後序 非遞迴 實現
1.簡述 void preorder node root 3.中序非遞迴 前序中的root主要作為中間變數使用。這裡的root的意義是下乙個要進棧的結點,初始值為根結點。while root不為空 棧不為空 void inorder node root else 4.後序非遞迴 root表示下乙個要...
前序 中序 後序 非遞迴 實現
1.簡述 void preorder node root 3.中序非遞迴 前序中的root主要作為中間變數使用。這裡的root的意義是下乙個要進棧的結點,初始值為根結點。while root不為空 棧不為空 else 4.後序非遞迴 root表示下乙個要處理的結點,初始化為根結點,per表示上一次剛...
二叉樹先序 中序 後序 層序遍歷的遞迴和非遞迴實現
先序 中序 後序三種遞迴遍歷 先序遍歷 void preorder treenode head 中序遍歷 void inorder treenode head 後序遍歷 void postorder treenode head 層序遍歷列印二叉樹的遞迴法 include includeusing n...