問題描述;
當我們建立了乙個二叉樹的結構時,對於該樹的遍歷方式有好幾種方式,我們有時會在筆試或面試中碰到諸如要求寫出某一種或某幾種二叉樹的遍歷方式的函式,在此將二叉樹的比那裡方式予以總結,對於前序,中序,後序這三種方式也存在遞迴和非遞迴的形式,而層序遍歷方式以非遞迴的方式予以實現,至於還有何其他的方式在此不做討論研究,因為筆者能力有限,也只會這幾種。熟知這幾種已足矣,求廣益求精。。。
※對於二叉樹的建立,見於《二叉樹的建立及其基礎操作》一文,在此不再贅述,對於其引數及左孩子(root->left),右孩子(root->right)等的使用,請參考上篇文章。
#includeusing namespace std;
//★1.前序遍歷(根->左子樹->右子樹)
//①遞迴遍歷
void prevorder(node* root)
cout << root->_data << " ";
prevorder(root->_left);//遞迴遍歷左子樹:注意左子樹遍歷完成時遞迴一層層返回至最後,才再次依次遍歷右子樹
prevorder(root->_right);//遞迴遍歷右子樹
}//②.非遞迴遍歷(借助棧的特性)
void prevorder_nr(node* root)
sp.push(root);
while (!sp.empty())
if (root->_left)
}}//★2.中序遍歷:左子樹->根節點->右子樹
//①.遞迴遍歷
void inorder(node* root)
inorder(root->_left);//過程類似先序,不過注意列印的順序
cout << root->_data << " ";
inorder(root->_right);
}//②.非遞迴遍歷(借助棧的特性)
void inorder_nr(node* root)
stacksp;
node* cur = root;
node* tmp = root;
while (cur || !sp.empty())
cur = sp.top();
cout << sp.top()->_data << " ";
sp.pop();
if (cur->_right == null)
else
}}//★3.後序遍歷:左子樹->右子樹->根節點
//①.遞迴遍歷
void postorder(node* root)
postorder(root->_left);
postorder(root->_right);
cout << root->_data << " ";
}//②.非遞迴遍歷(借助棧的特性)
void postorder_nr(node* root)
node* cur = root;
node* prev = null;
stacksp;
while (cur || !sp.empty())
cur = sp.top();
if (cur->_right == null || cur->_right == prev)
else
}}//★4.層序遍歷:依次遍歷每層各節點
//借助佇列的特性(先進先出)
void _levelorder(node* root)
q.push(root);
while (!q.empty())
if (q.front()->_right != null)
cout << q.front()->_data << " ";
q.pop();
}}
★注:對於初學者,建議先參考《二叉樹的建立及其基礎操作》一文,熟知二叉樹的結構後,再看本文,效果更佳。。
二叉樹遍歷方式
先序遍歷 根 左子樹 右子樹 遞迴版本 public static void preprint treenode root 非遞迴版本 public static void preorder treenode root if s.empty 中序遍歷 左子樹 根 右子樹 遞迴版本 public st...
二叉樹的遍歷總結
2 中序遍歷 3 後序遍歷 4 層次遍歷 給定乙個二叉樹,返回它的前序 遍歷。示例 輸入 1,null,2,3 輸出 1,2,3 definition for a binary tree node.public class treenode class solution private void h...
二叉樹的遍歷總結
遍歷方式 根結點 左孩子 右孩子 definition for a binary tree node.struct treenode class solution 遍歷方式 處理過程 definition for a binary tree node.struct treenode class so...