树的遍历

树遍历的三种方式

前序遍历:根节点->左子树->右子树(根节点在前面)
中序遍历:左子树->根节点->右子树(根节点在中间)
后序遍历:左子树->右子树->根节点(根节点在后边)
举例:

前序遍历:A-B-D-C-E-F
中序遍历:D-B-A-E-C-F
后序遍历:D-B-E-F-C-A

python实现三种遍历形式

前序遍历

def preorder(tree):
    if tree:
        print(tree.getRootVal())
        preorder(tree.getLeftChild())
        preorder(tree.getRightChild())

中序遍历

def inorder(tree):
    if tree:
        inorder(tree.getLeftChild())
        print(tree.getRootVal())
        inorder(tree.getRightChild())

后序遍历

def postorder(tree):
    if tree:
        postorder(tree.getLeftChild())
        postorder(tree.getRightChild())
        print(tree.getRootVal())

注意:

  • 三种遍历都是接受一个tree作为参数;
  • 三种遍历的代码形式上十分接近,只是print的位置不同。

当然,我们也可以将遍历的实现添加到BinaryTree类的内部:

    def preorder(self):
        print(self.getRootVal())
        if self.leftChild:
            self.getLeftChild().preorder()
        if self.rightChild:
            self.getRightChild().preorder()

    def postorder(self):
        if self.leftChild:
            self.getLeftChild().postorder()
        if self.rightChild:
            self.getRightChild().postorder()
        print(self.getRootVal())

    def inorder(self):
        if self.leftChild:
            self.getLeftChild().inorder()
        print(self.getRootVal())
        if self.rightChild:
            self.getRightChild().inorder()
posted @ 2019-01-06 18:12  youngliu91  阅读(115)  评论(0编辑  收藏  举报