二叉树的先根、中根、后根遍历 递归非递归python实现

'''
先根、中根、后根递归遍历二叉树
'''
 
class Node:
    
    def __init__(self, data=None, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right
        
class BinaryTreeOrderRecursive:
    ''' 递归遍历 '''
    def __init__(self, root=None):
        self.root = root
        
    def isEmpty(self):
        return self.root == None
    
    def preOrder(self, node):
        if node == None:
            return 
        # 先打印根节点,再打印左节点,后打印右节点
        print(node.data, end=' ')
        self.preOrder(node.left)
        self.preOrder(node.right)
        
    def inOrder(self, node):
        if node == None:
            return 
        # 先打印左结点,再打印根结点,后打印右结点
        self.inOrder(node.left)
        print(node.data, end=' ')
        self.inOrder(node.right)
        
    def postOrder(self, node):
        if node == None:
            return
        # 先打印左结点,再打印右结点,后打印根结点
        self.postOrder(node.left)
        self.postOrder(node.right)
        print(node.data, end=' ')
 

class BinaryTreeOrderUnRecursive:       
    ''' 非递归遍历 '''
    def __init__(self, root=None):
        self.root = root
        
    def isEmpty(self):
        return self.root == None
    
    def preOrder(self, node):
        stack = [node]
        while len(stack) > 0:
            print(node.data, end=' ')
            if node.right != None:
                stack.append(node.right)
            if node.left != None:
                stack.append(node.left)
            node = stack.pop()    
            
    def inOrder(self, node):
        stack = []
        pos = node
        while pos != None or len(stack) > 0:
            if pos != None:
                stack.append(pos)
                pos = pos.left
            else:
                pos = stack.pop()
                print(pos.data, end=' ')
                pos = pos.right
                
    def postOrder(self, node):
        '''
        使用两个栈结构
        第一个栈进栈顺序:左节点->右节点->跟节点
        第一个栈弹出顺序: 跟节点->右节点->左节点(先序遍历栈弹出顺序:跟->左->右)
        第二个栈存储为第一个栈的每个弹出依次进栈
        最后第二个栈依次出栈
        '''
        stack = [node]
        stack2 = []
        while len(stack) > 0:
            node = stack.pop()
            stack2.append(node)
            if node.left is not None:
                stack.append(node.left)
            if node.right is not None:
                stack.append(node.right)
        while len(stack2) > 0:
            print(stack2.pop().data, end=' ')
    
            
    def layerOrder(self, node):
        ''' 层次遍历'''
        import queue
        if node == None:
            return 
        que = queue.Queue()  # 创建一个先进先出的队列
        que.put(node)
        while not que.empty():
            out = que.get()   # 弹出第一个元素
            print(out.data)
            if out.left:  # 若该节点存在左子节点,则加入队列(先push左节点)
                que.put(out.left)
            if out.right:   # 若该节点存在右子节点,则加入队列(再push右节点)
                que.put(out.right)
        
    def treeNodeNum(self, node):
        # 求二叉树节点个数
        if node == None:
            return 0
        num = self.treeNodeNum(node.left)
        num += self.treeNodeNum(node.right)
        return num+1
            
    def bTreeDepth(self, node):
        # 二叉树的最大深度
        if node is None:
            return 0
        ldepth = self.bTreeDepth(node.left)
        rdepth = self.bTreeDepth(node.right)
        return (max(ldepth, rdepth) + 1)
                
    
    
n1 = Node(data="D")
n2 = Node(data="E")
n3 = Node(data="F")
n4 = Node(data="B", left=n1, right=n2)
n5 = Node(data="C", left=n3, right=None)
n6 = Node(data="A", left=n4, right=n5)
root = Node(data='M', left=None, right=n6)

bt = BinaryTreeOrderRecursive(root)
print('递归先序遍历')
bt.preOrder(bt.root)
print('\n')
print('递归中序遍历')
bt.inOrder(bt.root)
print('\n')
print('递归后序遍历')
bt.postOrder(bt.root)
print('\n')

bt = BinaryTreeOrderUnRecursive(root)
print('非递归先序遍历')
bt.preOrder(bt.root)
print('\n')
print('非递归中序遍历')
bt.inOrder(bt.root)
print('\n')
print('非递归后序遍历')
bt.postOrder(bt.root)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值