資料結構 筆記:二叉樹的典型遍歷方式
阿新 • • 發佈:2018-11-29
二叉樹是否只有一種遍歷方式(層次遍歷)?
典型的二叉樹遍歷方式
-先序遍歷(Pre-Order Traversal)
-中序遍歷(In-Order Traversal)
-後序遍歷(Post-Order Traversal)
先序遍歷(Pre-Order Traversal)
-二叉樹為空:
·無操作,直接返回
-二叉樹不為空:
1.訪問結點中的資料元素
2.先序遍歷左子樹
3.先序遍歷右子樹
先序遍歷功能定義
preOrderTraversal(node) { if(node != NULL) { access(node->value); preOrderTraversal(node->left); preOrderTraversal(node->right); } }
中序遍歷(In-Order Traversal)
-二叉樹為空:
·無操作,直接返回
-二叉樹不為空:
1.中序遍歷左子樹
2.訪問根節點中的資料元素
3.中序遍歷右子樹
中序遍歷功能定義
inOrderTraversal(node)
{
if(node != NULL)
{
inOrderTraversal(node->left);
access(node->value);
inOrderTraversal(node->right);
}
}
後序遍歷(Post-Order Traversal)
-二叉樹為空
·無操作,直接返回
-二叉樹不為空
1.後序遍歷左子樹
2.後序遍歷右子樹
3.訪問根節點中的資料元素
後序遍歷功能定義
postOrderTraversal(node)
{
if(node!=NULL)
{
postOrderTraversal(node->left);
postOrderTraversal(node->right);
access(node->value);
}
}
是否可以將二叉樹的典型遍歷演算法整合到BTree中?
如果可以,程式碼需要做怎樣的改動?
設計要點
-不能與層次遍歷函式衝突,必須設計新的函式介面
-演算法執行完成後,能夠方便的獲得遍歷結果
-遍歷結果能夠反映結點訪問的先後次序
函式的介面設計
-SharedPointer<Array <T>>traversal(BT Traversal order)
·根據引數order選擇執行遍歷演算法(先序,中序,後序)
·返回值為堆中的陣列物件(生命期智慧指標管理)
·陣列元素的次選反映遍歷的先後次序
SharedPointer<Array<int>> sp = NULL;
sp = tree.traversal(PreOrder);
for(int i = 0;i<(*sp).length();i++)
{
cout << (*sp)[i] <<endl;
}
總結:
-二叉樹的典型遍歷都是以遞迴方式執行的
-BTree以不同的函式介面支援典型遍歷
-層次遍歷與典型遍歷互不衝突
-遍歷結果能夠反映樹結點訪問的先後次序