python二叉树的遍历

觉得这个挺有趣的,记录一下

# -*- coding: utf-8 -*-
class TreeNode(object):
    def __init__(self,data=None,left=None,right=None):
        self.data = data
        self.left = left
        self.right = right
    
class BTree(object):
    def __init__(self,root=None):
        self.root = root
    
    def is_empty(self):
        if self.root is None:
            return True
        else:
            return False
    
    # 递归先序遍历
    def preOrder(self,treenode):
        if treenode is None:
            return
        print(treenode.data)
        self.preOrder(treenode.left)
        self.preOrder(treenode.right)
        
    # 非递归先序遍历
    def fOrder(self,treenode):
        stack = []
        p = treenode
        while p or len(stack) > 0:
            if p is not None:
                stack.append(p)
                print(p.data)
                p = p.left
            else:
                p = stack.pop()
                p = p.right
        
    # 递归中序遍历
    def inOrder(self,treenode):
        if treenode is None:
            return
        self.inOrder(treenode.left)
        print(treenode.data)
        self.inOrder(treenode.right)
    
    # 非递归中序遍历
    def mOrder(self,treenode):
        stack = []
        p = treenode
        while p or len(stack) > 0:
            if p is not None:
                stack.append(p)
                p = p.left
            else:
                p = stack.pop()
                print(p.data)
                p = p.right
        
    # 递归后序遍历
    def postOrder(self,treenode):
        if treenode is None:
            return
        self.postOrder(treenode.left)
        self.postOrder(treenode.right)
        print(treenode.data)
        
    # 非递归后序遍历
    def aOrder(self,treenode):
        stack = []
        result = []
        stack.append(treenode)
        #p = treenode
        while len(stack) > 0:
            node = stack.pop()
            result.insert(0,node)
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        [print(i.data) for i in result]
        
    # 层次遍历
    def leavelOrder(self,treenode):
        p = treenode
        queue = []
        queue.append(p)
        while len(queue) > 0:
            p = queue[0]
            print(p.data)
            queue.remove(queue[0])
            if p.left is not None:
                queue.append(p.left)
            if p.right is not None:
                queue.append(p.right)


# 递归最大深度1976
def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n*factorial(n-1)

if __name__ == '__main__':
    n3 = TreeNode(3)
    n8 = TreeNode(8)
    n9 = TreeNode(9)
    n10 = TreeNode(10)
    n11 = TreeNode(11)
    n6 = TreeNode(6,n8)
    n7 = TreeNode(7,None,n9)
    n4 = TreeNode(4,n6,n7)
    n1 = TreeNode(1,n3,n4)
    n5 = TreeNode(5,n10,n11)
    n2 = TreeNode(2,None,n5)
    root = TreeNode('root',n1,n2)
    bt = BTree(root)
    print('递归--先序-遍历......')
    bt.preOrder(bt.root)
    print('非递归--先序-遍历......')
    bt.fOrder(bt.root)
    print('递归--中序-遍历......')
    bt.inOrder(bt.root)
    print('非递归--中序-遍历......')
    bt.mOrder(bt.root)
    print('递归--后序-遍历......')
    bt.postOrder(bt.root)
    print('非递归--后序-遍历......')
    bt.aOrder(bt.root)
    print('层次遍历......')

    bt.leavelOrder(bt.root)


运行结果与算出来的一致


二叉树遍历是指按照一定的规则访问二叉树中的每一个节点。常见的二叉树遍历有前序遍历、中序遍历和后序遍历。 1. 前序遍历:按照根节点->左子树->右子树的顺序遍历二叉树。 2. 中序遍历:按照左子树->根节点->右子树的顺序遍历二叉树。 3. 后序遍历:按照左子树->右子树->根节点的顺序遍历二叉树。 下面是Python代码实现: ```python # 定义二叉树节点 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right # 前序遍历 def preorderTraversal(root: TreeNode) -> List[int]: if not root: return [] res = [] stack = [root] while stack: node = stack.pop() res.append(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left) return res # 中序遍历 def inorderTraversal(root: TreeNode) -> List[int]: if not root: return [] res = [] stack = [] while stack or root: while root: stack.append(root) root = root.left node = stack.pop() res.append(node.val) root = node.right return res # 后序遍历 def postorderTraversal(root: TreeNode) -> List[int]: if not root: return [] res = [] stack = [] while stack or root: while root: stack.append(root) root = root.left if root.left else root.right node = stack.pop() res.append(node.val) if stack and stack[-1].left == node: root = stack[-1].right return res ``` 其中,preorderTraversal函数实现前序遍历,inorderTraversal函数实现中序遍历,postorderTraversal函数实现后序遍历遍历过程中使用了栈来辅助实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值