二叉树添加元素与遍历(Python版)

class Node(object):
    def __init__(self,item):
        self.item = item
        self.lchild = None
        self.rchild = None

class Tree(object):
    def __init__(self):
        self.root = None

    def add(self,item):
        node = Node(item)
        #新建一个队列用来临时存放树的节点数据
        if self.root is None:
            self.root = node
            return

        queue = [self.root]

        while queue:
            cur_node = queue.pop(0)
            #取队列第一个元素,是因为树添加元素的时候,是广度遍历寻找空位
            #从上到下,从左到右,每一次寻找空位的时候都是队列最前面元素开始找
            #如果该元素的左右孩子皆有,将其添加到队列尾部,继续取第一个元素找。
            #该算法用队列最好了
            if cur_node.lchild is None:
                cur_node.lchild = node
                return
            else:
                queue.append(cur_node.lchild)

            if cur_node.rchild is None:
                cur_node.rchild = node
                return
            else:
                queue.append(cur_node.rchild)

    def breadth_travel(self):
        """广度遍历"""
        if self.root is None:
            return
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            print(cur_node.item,end=" ")
            if cur_node.lchild:
                queue.append(cur_node.lchild)
            if cur_node.rchild:
                queue.append(cur_node.rchild)

    def preorder(self,node):
        """先序遍历"""
        if node is None:
            return
        print(node.item,end=" ")
        self.preorder(node.lchild)
        self.preorder(node.rchild)

    def inorder(self,node):
        """中序遍历"""
        if node is None:
            return
        #先处理左边的,再处理中间,然后处理后边的
        self.inorder(node.lchild)
        print(node.item,end=" ")
        self.inorder(node.rchild)


    def postorder(self,node):
        """后序遍历"""
        if node is None:
            return
        # 先处理左边的,再处理右边,然后处理中间的
        self.postorder(node.lchild)
        self.postorder(node.rchild)
        print(node.item,end=" ")



if __name__ == __main__:
    tree = Tree()
    for i in range(10):
        tree.add(i)

    print("breadth_tarvel:",end="")
    tree.breadth_travel()
    print()
    print("preoder:",end="")
    tree.preorder(tree.root)
    print()
    print("inorder:",end="")
    tree.inorder(tree.root)
    print()
    print("postorder:",end="")
    tree.postorder(tree.root)

执行结果:

breadth_tarvel:0 1 2 3 4 5 6 7 8 9 
preoder:0 1 3 7 8 4 9 2 5 6 
inorder:7 3 8 1 9 4 0 5 2 6 
postorder:7 8 3 9 4 1 5 6 2 0
经验分享 程序员 微信小程序 职场和发展