Binary Tree traversal

深度優先 (Depth-first)

1.In-Order Traversal (LVR)

  • 中序

  • 步驟

    • 1.訪問左子樹

    • 2.訪問根節點

    • 3.訪問右子樹

  • 特性

    • 如果以Inoder走訪BST, 則可以得到一個有序數列

  • Code

void BinaryTree::Inorder(TreeNode *current){
    if (current) {
        // if current != NULL
        Inorder(current->leftchild);// L
        std::cout << current->str << " "; // V
        Inorder(current->rightchild); // R
    }
}

2.Post-Order Traversal (LRV)

  • 後序

  • 步驟

    • 1.訪問左子樹

    • 2.訪問右子樹

    • 3.訪問根節點

  • 特性

    • 可以利用Post order確定是否為AVL tree

  • Code

void BinaryTree::Postorder(TreeNode *current){
    if (current) { // if current != NULL
        Postorder(current->leftchild); // L
        Postorder(current->rightchild); // R
        std::cout << current->str << " "; // V
    }
}

3.Pre-Order Traversal(VLR)

廣度優先 (Breadth-first)

1.Level-Order Traversal

  • BST

  • 步驟

    • 1. 從queue加入tree的第一個node

    • 2.從queue清除本層(不管左右子樹)的所有成員

    • 3.從queue加入下一層(不管左右子樹)的所有成員

void BinaryTree::Levelorder(){
    std::queue<TreeNode*> q;
    q.push(this->root);
    while (!q.empty()){
        int size = q.size();
        for (int i = 0; i < size; ++i) {
            //從queue清除本層(不管左右子樹)的所有成員
            TreeNode *node = q.front();
            q.pop();
            //從queue加入下一層(不管左右子樹)的所有成員
            if (node->left) q.push(node->left);
            if (node->right) q.push(node->right);
        }
    }
}

Last updated