2012-04-12 73 views
7

Tôi vô vọng bị mất khi nói đến chức năng đệ quy. Tôi bắt buộc phải tạo một hàm đệ quy để đi qua một cây nhị phân và chèn một nút mới vào giữa các giá trị cụ thể. Tôi có cần phải recopy chức năng đi qua của tôi và sửa đổi nó trong mọi chức năng khác mà tôi sử dụng nó trong? Có ai đó vui lòng đánh giá chức năng đi qua không?Traversing một cây nhị phân đệ quy

Tôi nghĩ mã duyệt ngang của mình là không sao.

Node traverse (Node currentNode){ 
    if (!currentNode.left.equals(null)){ 
     traverse (currentNode.left); 
     return currentNode.left; 
    } 
    if (!currentNode.right.equals(null)){ 
     traverse (currentNode.right); 
     return currentNode.right; 
    } 
    return currentNode; 
} 
+1

Lệnh 'phương pháp traverse' là cho việc sử dụng các yếu tố trong cây nhị phân của bạn nhưng bạn đang trở về gốc trái, phải gốc hoặc gốc (thậm chí nếu gốc là 'null'!). Ý tưởng cho các hàm đệ quy là xác định trường hợp cơ sở và sau đó mã lặp lại để có được cho đến khi trường hợp cơ sở đó –

+0

Bạn đang cố gắng thực hiện một kiểu truyền tải nào? nó là một 'BST'? Bạn có cần chèn một nút vào đúng vị trí trong 'BST' không? – noMAD

+0

Nếu bạn đi qua bên trái, bạn quay trở lại như bước cuối cùng trong dòng 4 và không bao giờ đi qua bên phải và không bao giờ trả về mã hiện tại. Điều đó không ổn. –

Trả lời

13

Khi nói đến cây nhị phân, có một số loại traversals khác nhau có thể được thực hiện đệ quy. Chúng được viết theo thứ tự chúng được tham chiếu sau đó được truy cập (L = Left child, V = truy cập nút đó, R = right child).

  • In-trật tự traversal (LVR)
  • Xếp theo thứ tự traversal (RVL)
  • Preorder traversal (VLR)
  • Postorder traversal (LRV)

Mã của bạn dường như được thực hiện phương thức truyền tải postorder, nhưng bạn đang nhận được một vài điều hỗn hợp. Đầu tiên, nút là những gì bạn muốn đi qua; dữ liệu là những gì bạn muốn truy cập. Thứ hai, bạn không có lý do gì để trả lại chính nút đó, theo cách thực hiện điều này. Mã của bạn không cho phép một điều kiện để nói, 'Tôi đang tìm kiếm này dữ liệu cụ thể, bạn có nó ông Node @ 0xdeadbeef?', Mà sẽ được tìm thấy với một số loại tham số tìm kiếm thêm.

Trình duyệt BST học tập chỉ in chính các nút. Nếu bạn muốn thêm chức năng tìm kiếm, nó chỉ thêm một tham số nữa, cũng như kiểm tra bổ sung cho nút bên phải.

Dưới đây là một đoạn:

// Academic 

public void traverse (Node root){ // Each child of a tree is a root of its subtree. 
    if (root.left != null){ 
     traverse (root.left); 
    } 
    System.out.println(root.data); 
    if (root.right != null){ 
     traverse (root.right); 
    } 
} 

// Search with a valid node returned, assuming int 

public Node traverse (Node root, int data){ // What data are you looking for again? 
    if(root.data == data) { 
     return root; 
    } 
    if (root.left != null){ 
     return traverse (root.left, data); 
    } 
    if (root.right != null){ 
     return traverse (root.right, data); 
    } 
    return null; 
} 
+0

Cảm ơn bạn. Tôi không biết mình đang làm gì. – Nyx

0

Hàm đệ quy trả về giá trị của chính nó với thông số được sửa đổi hoặc điều kiện kết thúc (thoát). ví dụ, thừa:

int factorial(int param) { 
    if (param > 1) { 
     return param * factorial(param -1); 
    } else { 
     return 1; 
    } 
} 

Trong code của bạn, bạn gọi một 'traverse' nhưng sau đó không làm gì với kết quả ... Khi hàm đệ quy của bạn kết thúc, trở lại cuối cùng của bạn sẽ là con trái đầu tiên nếu nó tồn tại, khác con đầu tiên nếu nó tồn tại, khác nút gốc. Vui lòng cung cấp thêm chi tiết về lý do tại sao bạn cần phải đi qua cây (ngoài ra, không chắc chắn ý bạn là gì "sao chép hàm và sửa đổi nó trong mọi chức năng khác", toàn bộ ý tưởng của hàm là mã một lần -call-nhiều)

1

Nó có vẻ như bạn đang đi qua trong phương pháp đặt hàng trước, nhưng tôi là một chút hoài nghi về những gì chính xác bạn muốn thực hiện mà không thực sự so sánh nút hiện tại của bạn với một số giá trị cơ sở đó xác định u đã đạt ur Nơi Đến. Tôi sẽ đề nghị vẽ ra một cái cây đơn giản và hình dung các bước. Sau đó cố gắng đưa mã đó vào mã.

+1

Chính xác. Vẽ trên giấy và hiểu các bước đầu tiên. Sau đó chèn các câu lệnh in vào mã của bạn để bạn có thể thấy những gì thực sự xảy ra ở mỗi bước. Một khi bạn nhận được khái niệm đệ quy nó không thực sự là khó khăn. –

Các vấn đề liên quan