Hướng dẫn python traverse non binary tree - python đi ngang không phải cây nhị phân

Tôi đã tạo lớp tùy chỉnh cho các nút

class NodeTree(object):
    def __init__(self, name = None, children = None):
        self.name = name
        self.children = children

và xác định một chức năng tạo ra một cây (một nút chứa các nút con cái của nó)

def create_tree(d):
    x = NodeTree()
    for a in d.keys():
        if type(d[a]) == str:
            x.name = d[a]
        if type(d[a]) == list:
            if d[a] != []:
                for b in d[a]:
                    x.add_child(create_tree(b))
    return x

Đầu vào là một dict với một đối số cho tên nút và danh sách với con của nó ở cùng một hình thức với cha mẹ. Chức năng hoạt động tốt và tôi đã tạo ra phương pháp chứng minh điều đó nhưng tôi không thể tìm ra cách để vượt qua nó ngay và có được chiều cao của cây. Tôi không biết liệu "chiều cao" đó là thuật ngữ đúng vì tôi biết nó có thể là mơ hồ, tôi cần coi nút là một đơn vị đo lường, như thế này:

                                      parent
                                         |
                                         |
                                     ---------
                                     |       |
                                    child   child

Chiều cao của cây này là 2, tôi đã thử tất cả mọi thứ, từ quầy đến thẻ trong lớp, mọi thứ dường như thoái hóa tôi không bao giờ có được chiều cao phù hợp. Làm thế nào tôi nên tiếp cận điều đó?


Traversal là một quá trình để truy cập tất cả các nút của cây và cũng có thể in các giá trị của chúng. Bởi vì, tất cả các nút được kết nối thông qua các cạnh (liên kết), chúng tôi luôn bắt đầu từ nút gốc (đầu). Đó là, chúng ta không thể truy cập ngẫu nhiên một nút trong cây. Có ba cách mà chúng ta sử dụng để đi qua một cây -

  • Theo đơn đặt hàng
  • Traversal đặt hàng trước
  • Traversal sau đơn đặt hàng

Theo đơn đặt hàng

Traversal đặt hàng trước

Trong phương pháp truyền tải này, cây con bên trái được truy cập trước, sau đó là gốc và sau đó là cây con bên phải. Chúng ta nên luôn luôn nhớ rằng mọi nút có thể đại diện cho chính một cây con.

class Node:

    def __init__(self, data):

        self.left = None
        self.right = None
        self.data = data
# Insert Node
    def insert(self, data):

        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

# Print the Tree
    def PrintTree(self):
        if self.left:
            self.left.PrintTree()
        print( self.data),
        if self.right:
            self.right.PrintTree()

# Inorder traversal
# Left -> Root -> Right
    def inorderTraversal(self, root):
        res = []
        if root:
            res = self.inorderTraversal(root.left)
            res.append(root.data)
            res = res + self.inorderTraversal(root.right)
        return res

root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.inorderTraversal(root))

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

[10, 14, 19, 27, 31, 35, 42]

Traversal đặt hàng trước

Trong phương pháp truyền tải này, cây con bên trái được truy cập trước, sau đó là gốc và sau đó là cây con bên phải. Chúng ta nên luôn luôn nhớ rằng mọi nút có thể đại diện cho chính một cây con.

Trong chương trình Python dưới đây, chúng tôi sử dụng lớp nút để tạo chủ sở hữu vị trí cho nút gốc cũng như các nút trái và bên phải. Sau đó, chúng tôi tạo một chức năng chèn để thêm dữ liệu vào cây. Cuối cùng, logic chuyển đổi hàng đầu được triển khai bằng cách tạo một danh sách trống và thêm nút bên trái trước đó là nút gốc hoặc nút cha. Cuối cùng, nút bên trái được thêm vào để hoàn thành việc chuyển đổi thứ tự. Xin lưu ý rằng quá trình này được lặp lại cho mỗi cây con cho đến khi tất cả các nút được đi qua.

class Node:

    def __init__(self, data):

        self.left = None
        self.right = None
        self.data = data
# Insert Node
    def insert(self, data):

        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

# Print the Tree
    def PrintTree(self):
        if self.left:
            self.left.PrintTree()
        print( self.data),
        if self.right:
            self.right.PrintTree()

# Preorder traversal
# Root -> Left ->Right
    def PreorderTraversal(self, root):
        res = []
        if root:
            res.append(root.data)
            res = res + self.PreorderTraversal(root.left)
            res = res + self.PreorderTraversal(root.right)
        return res

root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PreorderTraversal(root))

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

[27, 14, 10, 19, 35, 31, 42]

Traversal sau đơn đặt hàng

Trong phương thức truyền tải này, nút gốc được truy cập cuối cùng, do đó tên. Đầu tiên chúng tôi đi qua cây con bên trái, sau đó là cây con bên phải và cuối cùng là nút gốc.

Trong chương trình Python dưới đây, chúng tôi sử dụng lớp nút để tạo chủ sở hữu vị trí cho nút gốc cũng như các nút trái và bên phải. Sau đó, chúng tôi tạo một chức năng chèn để thêm dữ liệu vào cây. Cuối cùng, logic truyền tải sau đơn đặt hàng được triển khai bằng cách tạo một danh sách trống và thêm nút bên trái trước tiên là nút bên phải. Cuối cùng, nút gốc hoặc nút cha được thêm vào để hoàn thành việc chuyển đổi sau đơn đặt hàng. Xin lưu ý rằng quá trình này được lặp lại cho mỗi cây con cho đến khi tất cả các nút được đi qua.

class Node:

    def __init__(self, data):

        self.left = None
        self.right = None
        self.data = data
# Insert Node
    def insert(self, data):

        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

# Print the Tree
    def PrintTree(self):
        if self.left:
            self.left.PrintTree()
        print( self.data),
        if self.right:
            self.right.PrintTree()

# Postorder traversal
# Left ->Right -> Root
    def PostorderTraversal(self, root):
        res = []
        if root:
            res = self.PostorderTraversal(root.left)
            res = res + self.PostorderTraversal(root.right)
            res.append(root.data)
        return res

root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PostorderTraversal(root))

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

[10, 19, 14, 31, 42, 35, 27]

Có thể không

Một cây có thể là nhị phân trên không nhị phân.Trong một cây nhị phân, mỗi nút có tối đa hai - trái và phải - trẻ em.Một nút trong một cây không nhị phân có thể có nhiều con hơn.Đi qua một cái cây có nghĩa là đi qua mọi nút trong đó.Traversing a tree means going through every node in it.

Bạn có thể đi qua một cái cây mà không có đệ quy?

Sử dụng ngăn xếp là cách rõ ràng để đi qua cây mà không cần đệ quy.Dưới đây là một thuật toán để đi qua cây nhị phân bằng cách sử dụng ngăn xếp.. Below is an algorithm for traversing binary tree using stack.

Cây nhị phân Traverse là gì?

Traversal là một hoạt động phổ biến được thực hiện trên các cấu trúc dữ liệu.Đó là quá trình trong đó mỗi và mọi yếu tố có trong cấu trúc dữ liệu được "truy cập" (hoặc truy cập) ít nhất một lần.Điều này có thể được thực hiện để hiển thị tất cả các yếu tố hoặc để thực hiện một thao tác trên tất cả các yếu tố.the process in which each and every element present in a data structure is "visited" (or accessed) at least once. This may be done to display all of the elements or to perform an operation on all of the elements.

4 cách để đi qua một cây nhị phân là gì?

Truyền tải theo thứ tự (phải rễ trái)..
Traverse trái cây con bên trái ..
Traverse Root Node ..
Traverse phải cây con ..