Trong phần này, chúng ta sẽ thấy các thuật toán duyệt khác nhau để duyệt các khóa có trong cây tìm kiếm nhị phân. Các trình duyệt này là trình duyệt Inorder, truyền tải đơn đặt hàng trước, truyền tải đơn đặt hàng sau và truyền tải theo thứ tự cấp độ.
Giả sử chúng ta có một cây như thế này -
Trình tự duyệt Inorder sẽ như thế nào - 5 8 10 15 16 20 23
Trình tự duyệt của Đặt hàng trước sẽ giống như - 10 5 8 16 15 20 23
Trình tự duyệt Postorder sẽ như thế nào - 8 5 15 23 20 16 10
Trình tự duyệt theo thứ tự Cấp sẽ giống như - 10, 5, 16, 8, 15, 20, 23
Thuật toán
inorderTraverse (root):Bắt đầu nếu root không trống, sau đó inorderTraversal (bên trái của root) in giá trị của root inorderTraversal (bên phải của root) end ifEndpreorderTraverse (root):Bắt đầu nếu root không trống, sau đó in giá trị of root preorderTraversal (left of root) preorderTraversal (right of root) end ifEndpostorderTraverse (root):Bắt đầu nếu root không trống, sau đó postorderTraversal (left of root) postorderTraversal (bên phải root) in giá trị của root end ifEndlevelOrderTraverse (root) :Bắt đầu xác định hàng đợi hàng đợi để lưu trữ các nút chèn gốc vào hàng đợi. trong khi hàng đợi không trống, do item:=item hiện diện ở vị trí phía trước của hàng đợi in ra giá trị của item nếu bên trái của item không phải là rỗng, sau đó chèn bên trái của item vào cuối hàng nếu nếu bên phải của item không phải là rỗng, sau đó chèn bên phải của mục vào cuối hàng nếu xóa phần tử phía trước khỏi hàng doneEnd
Ví dụ
#include#include using namespace std; class node {public:int h_left, h_right, bf, value; node * left, * right;}; cây lớp {private:node * get_node (int key); public:node * root; cây () {root =NULL; // đặt root là NULL ở đầu} void inorder_traversal (node * r); void preorder_traversal (nút * r); void postorder_traversal (nút * r); void levelorder_traversal (nút * r); node * insert_node (node * root, int key);}; node * tree ::get_node (int key) {node * new_node; new_node =nút mới; // tạo một 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 trữ giá trị từ khóa đã cho new_node-> left =NULL; new_node-> right =NULL; return new_node;} void tree ::inorder_traversal (node * r) {if (r! =NULL) {// Khi có root, hãy truy cập left - root - right inorder_traversal (r-> left); cout < value <<""; inorder_traversal (r-> phải); }} void tree ::preorder_traversal (node * r) {if (r! =NULL) {// Khi có root, hãy truy cập left - root - right cout < value <<""; preorder_traversal (r-> left); preorder_traversal (r-> right); }} void tree ::postorder_traversal (node * r) {if (r! =NULL) {// Khi có root, hãy truy cập left - root - right postorder_traversal (r-> left); postorder_traversal (r-> right); cout < value <<""; }} void tree ::levelorder_traversal (node * root) {queue que; nút * mục; que.push (gốc); // chèn gốc lúc đầu while (! que.empty ()) {item =que.front (); // lấy phần tử từ front end cout < value <<""; if (item-> left! =NULL) // Khi xuất hiện con left, insert vào queue que.push (item-> left); if (item-> right! =NULL) // Khi có con bên phải, insert vào queue que.push (item-> right); que.pop (); // xóa mục khỏi hàng đợi}} node * tree ::insert_node (node * root, int key) {if (root ==NULL) {return (get_node (key)); // khi cây trống, hãy tạo một nút làm gốc} if (key value) {// khi key nhỏ hơn giá trị root, chuyển đến root bên trái-> left =insert_node (root-> left, key ); } else if (key> root-> value) {// khi key lớn hơn giá trị root, chuyển đến root bên phải-> right =insert_node (root-> right, key); } trả về gốc; // khi key đã có thì không chèn lại nữa} main () {node * root; cây 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 <<"In-Order Traversal:"; my_tree.inorder_traversal (my_tree.root); cout <<"\ nTruyền tải đơn đặt hàng trước:"; my_tree.preorder_traversal (my_tree.root); cout <<"\ nTruyền tải Đơn đặt hàng Bài đăng:"; my_tree.postorder_traversal (my_tree.root); cout <<"\ nTruyền tải thứ tự cấp độ:"; my_tree.levelorder_traversal (my_tree.root);}
Đầu ra
Truyền tải đơn hàng:5 8 10 15 16 20 23 Truyền tải đơn đặt hàng trước:10 5 8 16 15 20 23 Truyền tải đơn đặt hàng trước:8 5 15 23 20 16 10 Truyền tải đơn đặt hàng cấp độ:10 5 16 8 15 20 23