Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Duyệt cây nhị phân theo cấp độ (Level Order) trong C++

Giả sử chúng ta có một cây nhị phân. Ta phải duyệt cây theo thứ tự cấp độ (level order). Ví dụ cây:

Duyệt cây nhị phân theo cấp độ (Level Order) trong C++

Thứ tự duyệt: [10, 5, 16, 8, 15, 20, 23]

Để giải quyết, ta làm theo các bước:

  • định nghĩa hàng đợi que lưu nút
  • thêm root vào que
  • while que không rỗng
    • item := phần tử ở đầu hàng đợi
    • in giá trị item
    • nếu left của item không null, thêm left vào que
    • nếu right của item không null, thêm right vào que
    • xóa phần tử đầu que

Ví dụ (C++)

Hãy xem triển khai sau:

#include<iostream> #include<queue> using namespace std; class node{    public:       int h_left, h_right, bf, value;       node *left, *right; }; class tree{    private:       node *get_node(int key);    public:       node *root;       tree(){          root = NULL; //khởi tạo root NULL       }       void levelorder_traversal(node *r);       node *insert_node(node *root, int key); }; node *tree::get_node(int key){    node *new_node;    new_node = new node; //tạo nút mới động    new_node->h_left = 0; new_node->h_right = 0;    new_node->bf = 0;    new_node->value = key; //lưu giá trị từ key    new_node->left = NULL; new_node->right = NULL;    return new_node; } void tree::levelorder_traversal(node *root){    queue <node*> que;    node *item;    que.push(root); //thêm root trước    while(!que.empty()){       item = que.front(); //lấy phần tử đầu       cout << item->value << " ";       if(item->left != NULL) //khi có con trái, thêm vào queue          que.push(item->left);       if(item->right != NULL) //khi có con phải, thêm vào queue          que.push(item->right);       que.pop(); //xóa phần tử khỏi queue    } } node *tree::insert_node(node *root, int key){    if(root == NULL){       return (get_node(key)); //khi cây rỗng, tạo nút làm root    }    if(key < root->value){ //key nhỏ hơn root, đi trái       root->left = insert_node(root->left, key);    }    else if(key > root->value){ //key lớn hơn root, đi phải       root->right = insert_node(root->right, key);    }    return root; //key đã có, không chèn lại } main(){    node *root;    tree my_tree;    //Chèn một số khóa vào cây.    my_tree.root = my_tree.insert_node(my_tree.root, 10);    my_tree.root = my_tree.insert_node(my_tree.root, 5);    my_tree.root = my_tree.insert_node(my_tree.root, 16);    my_tree.root = my_tree.insert_node(my_tree.root, 20);    my_tree.root = my_tree.insert_node(my_tree.root, 15);    my_tree.root = my_tree.insert_node(my_tree.root, 8);    my_tree.root = my_tree.insert_node(my_tree.root, 23);    cout << "Duyệt theo cấp độ: ";    my_tree.levelorder_traversal(my_tree.root); }

Input

[10,5,16,null,8,15,20,null,null,null,null,null,null,null,23]

Output

Duyệt theo cấp độ: 10 5 16 8 15 20 23