1. 程式人生 > >資料結構 筆記:二叉樹的典型遍歷方式

資料結構 筆記:二叉樹的典型遍歷方式

二叉樹是否只有一種遍歷方式(層次遍歷)?

典型的二叉樹遍歷方式

-先序遍歷(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以不同的函式介面支援典型遍歷

-層次遍歷與典型遍歷互不衝突

-遍歷結果能夠反映樹結點訪問的先後次序