Hướng dẫn search n-ary tree python - tìm kiếm trăn cây n-ary

Tôi đang cố gắng xây dựng một chức năng tìm kiếm cho cây n-ary. Đây là cách lớp nút như thế nào:

class node[object]:
  """docstring for node"""
  def __init__[self, val='']:
    self.val = val #value of the node
    self.subtrees = [] #list of subtree node objects

Sau đây là mã cách tôi gọi chức năng tìm kiếm:

temp_search[root, "1"]

Và có một nút có giá trị là "1". Và tôi hy vọng đối tượng nút sẽ được trả lại khi tìm kiếm thành công.

Sau đây là chức năng tìm kiếm đầu tiên của tôi mà tôi đã thực hiện:

#temp_search v0.1
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node
    for subtree in node.subtrees:         
        return temp_search[subtree, key]

Điều trên trả về 'Không có' và nó không bao giờ được in 'Tìm thấy'

Bây giờ tôi đã sửa đổi nó một chút:

#temp_search v0.2
def temp_search[node, key]:
    if node.val == key:
        print 'found', node
        return node
    for subtree in node.subtrees:         
        temp_search[subtree, key]  

Mặc dù nó trả về 'none' nó vẫn được in 'tìm thấy'. Được rồi, đó là một số cải tiến.

Vì vậy, tôi nhận ra rằng Loop đang chạy trên mỗi đối tượng Subtree ngay cả sau khi nó trả về nút. Điều đó có ý nghĩa gì? Bởi vì tôi nghĩ rằng một khi nó trở lại một cái gì đó, nó sẽ ra khỏi nó phải không? Vì vậy, đã sửa đổi nó một lần nữa:

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp

Tương tự, tôi đã thực hiện tìm kiếm đa như thế này [tức là. nó sẽ trả về tất cả các nút có giá trị khớp với khóa]

#temp_multi_search v0.1
def temp_multi_search[some_node, key, result=[]]:
    if some_node.val == key:
        print 'found', some_node
        return result.append[some_node]
    for subtree in some_node.subtrees:         
        temp = temp_multi_search[subtree, key, result]
        if temp:
            result.append[temp]
    return result

Tôi sẽ gọi chức năng ở trên như thế này:

temp_multi_search[root, "1"]

Nhưng tôi đã nhận được kết quả như:

#temp_search v0.2
def temp_search[node, key]:
    if node.val == key:
        print 'found', node
        return node
    for subtree in node.subtrees:         
        temp_search[subtree, key]  
9

Vì vậy, nó đã được nối lại danh sách trống [?]. Đây là cách tôi đã sửa nó:

#temp_multi_search v0.2
def temp_multi_search[some_node, key, result=[]]:
    #result = []
    if some_node.val == key:
        print 'found', some_node
        return result.append[some_node]
    for subtree in some_node.subtrees:         
        temp = temp_multi_search[subtree, key, result]
        if isinstance[temp, node]:
             result.append[temp]
    return result

Bây giờ tôi sẽ nhận được chính xác, kết quả dự kiến:

[, ]

Đây là những câu hỏi của tôi:

  1. Tại sao Temp_Search v0.1 thất bại? Khi đi qua mỗi cây con, khi kết quả tìm kiếm được tìm thấy, giá trị được trả về. Tại sao vòng lặp không bị chấm dứt?
  2. Trong Temp_Search v0.2, tôi không có câu lệnh trả về cho vòng lặp. Vì vậy, những gì khác biệt ở đây nó đang làm? Vì đối tượng đang được tìm thấy, nhưng làm thế nào để tôi trả lại nó thành công?
  3. Tôi đã thực hiện Temp_Search v0.3 theo cách đúng đắn chưa? Bất kỳ cải tiến?
  4. Tại sao Temp_Multi_Search v0.1 bị lỗi?
  5. Tôi đã thực hiện Temp_Multi_Search v0.2 theo cách đúng đắn chưa? Bất kỳ cải tiến?

Đây là những gì tôi nghĩ:

  1. Tôi nghĩ rằng vòng lặp đang chạy chỉ là một lần. Nó chỉ tìm kiếm trong phần cây con đầu tiên [đệ quy], trả về nếu mục không xuất hiện, nó không trả lại. Tôi đã xác nhận điều này thông qua việc gửi một giá trị có mặt trong lần con đầu tiên
  2. Ở đây cho vòng lặp đang chạy thành công trên mỗi cây con, đó là lý do tại sao nó có thể tìm thấy nút. Nhưng làm cách nào để làm cho nó trả về nút khác phương thức khác ngoài Temp_Search v0.3? Tôi tìm thấy temp_search v0.3 ít pythonic
  3. -
  4. Tôi nghĩ rằng nó đang thất bại vì nhiệt độ hoàn trả sẽ là một danh sách nào đó, vì vậy nó chỉ cần nối lại nó.
  5. -

Thăm một đứa trẻ đầu tiên ..

current_node->child = malloc[3 * sizeof[node *]];

for [i=0; ichild[i] = createNode[array[i],[current_node->depth]+1];
    current_node->children++;
    printf["%s  has been inserted to the tree\n",current_node->word];
}

Thăm một đứa trẻ thứ hai ..

temp_search[root, "1"]
0

Thăm đứa con cuối cùng đệ quy ..

temp_search[root, "1"]
1

In dữ liệu trong nút ..

temp_search[root, "1"]
2

Cây chung là một tập hợp các nút trong đó mỗi nút là cấu trúc dữ liệu bao gồm các bản ghi và danh sách các tài liệu tham khảo cho trẻ em của nó [không được phép tham khảo trùng lặp]. Không giống như danh sách được liên kết, mỗi nút lưu trữ địa chỉ của nhiều nút. Mỗi địa chỉ lưu trữ nút của trẻ em và địa chỉ nút đầu tiên sẽ được lưu trữ trong một con trỏ riêng gọi là Root.

Các cây chung là những cây n-ary có các thuộc tính sau: & nbsp;

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1. Nhiều trẻ em ở mọi nút.

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 2. Số lượng nút cho mỗi nút không được biết trước.

Example:     
 

Cây chung

Để đại diện cho cây trên, chúng ta phải xem xét trường hợp xấu nhất, đó là nút có trẻ em tối đa [trong ví dụ trên, 6 trẻ em] và phân bổ nhiều gợi ý cho mỗi nút. Biểu diễn nút dựa trên phương pháp này có thể được viết là: & nbsp;The node representation based on this method can be written as: 
The node representation based on this method can be written as:
 

C

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
3

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
5

temp_search[root, "1"]
00

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
03

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
06

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
09

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
12

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
15

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
18
temp_search[root, "1"]
19

Nhược điểm của đại diện trên là: & nbsp;  

  1. Sự lãng phí bộ nhớ - Tất cả các con trỏ không bắt buộc trong tất cả các trường hợp. Do đó, có rất nhiều lãng phí bộ nhớ. – All the pointers are not required in all the cases. Hence, there is lot of memory wastage. – All the pointers are not required in all the cases. Hence, there is lot of memory wastage.
  2. Số lượng trẻ em chưa biết - Số trẻ em cho mỗi nút không được biết trước. – The number of children for each node is not known in advance. – The number of children for each node is not known in advance.

Cách tiếp cận đơn giản: & nbsp;  

Để lưu trữ địa chỉ của trẻ em trong một nút, chúng tôi có thể sử dụng một mảng hoặc danh sách được liên kết. Nhưng chúng tôi sẽ phải đối mặt với một số vấn đề với cả hai.

  1. Trong danh sách được liên kết, chúng tôi không thể truy cập ngẫu nhiên bất kỳ địa chỉ trẻ con nào. Vì vậy, nó sẽ đắt tiền.Linked list, we can not randomly access any child’s address. So it will be expensive.Linked list, we can not randomly access any child’s address. So it will be expensive.
  2. Trong Array, chúng tôi có thể truy cập ngẫu nhiên địa chỉ của bất kỳ đứa trẻ nào, nhưng chúng tôi chỉ có thể lưu trữ số lượng địa chỉ trẻ em cố định trong đó.array, we can randomly access the address of any child, but we can store only fixed number of children’s addresses in it.array, we can randomly access the address of any child, but we can store only fixed number of children’s addresses in it.

Cách tiếp cận tốt hơn:

Chúng ta có thể sử dụng các mảng động để lưu trữ địa chỉ của địa chỉ trẻ em. Chúng tôi có thể truy cập ngẫu nhiên bất kỳ địa chỉ trẻ con nào và kích thước của vectơ cũng không được sửa.

C

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
3

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
5

temp_search[root, "1"]
00
temp_search[root, "1"]
22
temp_search[root, "1"]
26
temp_search[root, "1"]
19

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2
temp_search[root, "1"]
03

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

Nhược điểm của đại diện trên là: & nbsp; 

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
09

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
12
  • #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    4
    #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    2
    temp_search[root, "1"]
    
    15

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
18 
 

Sự lãng phí bộ nhớ - Tất cả các con trỏ không bắt buộc trong tất cả các trường hợp. Do đó, có rất nhiều lãng phí bộ nhớ. – All the pointers are not required in all the cases. Hence, there is lot of memory wastage.

Số lượng trẻ em chưa biết - Số trẻ em cho mỗi nút không được biết trước. – The number of children for each node is not known in advance.
 

C

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
3

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
5

temp_search[root, "1"]
00

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
03

#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
4
#temp_search v0.3
def temp_search[node, key]:
    if node.val == key:
        print 'Found', node
        return node       
    for subtree in node.subtrees:         
        temp = temp_search[subtree, key]
        if temp:
            return temp
2

temp_search[root, "1"]
06
temp_search[root, "1"]
19

Advantages:   

  • #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    4
    #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    2
    temp_search[root, "1"]
    
    09
  • #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    4
    #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    2
    temp_search[root, "1"]
    
    12
  • #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    4
    #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    2
    temp_search[root, "1"]
    
    15
  • #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    4
    #temp_search v0.3
    def temp_search[node, key]:
        if node.val == key:
            print 'Found', node
            return node       
        for subtree in node.subtrees:         
            temp = temp_search[subtree, key]
            if temp:
                return temp
    
    2
    temp_search[root, "1"]
    
    18

Nhược điểm của đại diện trên là: & nbsp; 
Generic tree – level order traversal


Sự lãng phí bộ nhớ - Tất cả các con trỏ không bắt buộc trong tất cả các trường hợp. Do đó, có rất nhiều lãng phí bộ nhớ. – All the pointers are not required in all the cases. Hence, there is lot of memory wastage.

Số lượng trẻ em chưa biết - Số trẻ em cho mỗi nút không được biết trước. – The number of children for each node is not known in advance..

Cách tiếp cận đơn giản: & nbsp; 

Để lưu trữ địa chỉ của trẻ em trong một nút, chúng tôi có thể sử dụng một mảng hoặc danh sách được liên kết. Nhưng chúng tôi sẽ phải đối mặt với một số vấn đề với cả hai.

Trong danh sách được liên kết, chúng tôi không thể truy cập ngẫu nhiên bất kỳ địa chỉ trẻ con nào. Vì vậy, nó sẽ đắt tiền.Linked list, we can not randomly access any child’s address. So it will be expensive.

Trong Array, chúng tôi có thể truy cập ngẫu nhiên địa chỉ của bất kỳ đứa trẻ nào, nhưng chúng tôi chỉ có thể lưu trữ số lượng địa chỉ trẻ em cố định trong đó.array, we can randomly access the address of any child, but we can store only fixed number of children’s addresses in it.

Cách tiếp cận tốt hơn:

Chúng ta có thể sử dụng các mảng động để lưu trữ địa chỉ của địa chỉ trẻ em. Chúng tôi có thể truy cập ngẫu nhiên bất kỳ địa chỉ trẻ con nào và kích thước của vectơ cũng không được sửa.

temp_search[root, "1"]
06

Nhược điểm của đại diện trên là: & nbsp;At each node-link the children of the same parent[siblings] from left to right. Remove the links from parent to all children except the first child.

Sự lãng phí bộ nhớ - Tất cả các con trỏ không bắt buộc trong tất cả các trường hợp. Do đó, có rất nhiều lãng phí bộ nhớ. 

Nhược điểm của đại diện trên là: & nbsp;Generic tree – level order traversala tree in which each node has n children or no children.

N

Cho một cây n-ary chứa, nhiệm vụ là in các đường truyền từ của cây ...up to n children nodes for each of the nodes, differing from the standard binary trees which allow only up to 2 children nodes for each node. The above picture shows an example of an n-ary tree.

Bài Viết Liên Quan

Chủ Đề