树的遍历
树遍历的三种方式
前序遍历:根节点->左子树->右子树(根节点在前面)
中序遍历:左子树->根节点->右子树(根节点在中间)
后序遍历:左子树->右子树->根节点(根节点在后边)
举例:
前序遍历: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()