二叉树的遍历(Python版本)

1.二叉树的结构

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

2.前序遍历(递归)

def preTraverse_recur( pRoot ):
    if pRoot==None:
        return

    res=[]

    res.append( pRoot.val )

    if pRoot.left!=None:
        res.extend( preTraverse_recur( pRoot.left ) )

    if pRoot.right!=None:
        res.extend( preTraverse_recur( pRoot.right ) )

    return res

3.前序遍历(非递归) 

def preTraverse_No_recur( pRoot ):
    if pRoot == None:
        return None

    res = []
    node_stack = []

    p = pRoot

    while len(node_stack) > 0 or p != None:
        while p != None:
            res.append( p.val )
            node_stack.append(p)
            p = p.left

        if len(node_stack) > 0:
            p = node_stack[-1]
            node_stack.pop(-1)

            # res.append( p.val )
            p = p.right

    return res

4.中序遍历(递归) 

def inTraverse_recur( proot ):
    res=[]

    if proot==None:
        return res

    if proot.left!=None:
        res+=inTraverse_recur( proot.left )

    res.append( proot.val )

    if proot.right!=None:
        res+=inTraverse_recur( proot.right )

    return res

 5.中序遍历(非递归)

def inTraverse_No_recur( pRoot ):
    if pRoot == None:
        return None

    res = []
    node_stack = []

    p = pRoot

    while len(node_stack) > 0 or p != None:
        while p != None:
            # res.append( p.val )
            node_stack.append(p)
            p = p.left

        if len(node_stack) > 0:
            p = node_stack[-1]
            node_stack.pop(-1)

            res.append( p.val )
            p = p.right

    return res

6.后序遍历(递归)

def postTraverse_recur( pRoot ):
    res=[]

    if pRoot==None:
        return res

    if pRoot.left!=None:
        res+=postTraverse_recur( pRoot.left )

    if pRoot.right!=None:
        res+=postTraverse_recur( pRoot.right )

    res.append( pRoot.val )

    return res

7.后序遍历(非递归)

def postTraverse_No_recur( pRoot ):

    res=[]

    if pRoot==None:
        return res

    p=pRoot

    stack1=[]
    stack2=[]

    while len( stack1 )>0 or p!=None:
        while p!=None:
            stack1.append( p )
            stack2.append( p )
            p=p.right

        if len( stack1 )>0:
            p=stack1.pop( -1 )
            p=p.left

    for i in range( len( stack2 ) ):
        res.append( stack2.pop( -1 ).val )

    return res

8.层序遍历

def seqeueceTraverse( pRoot ):
    res=[]

    if pRoot==None:
        return res

    nodes_queue=[]

    nodes_queue.append( pRoot )

    while len( nodes_queue )>0:

        for i in range( len( nodes_queue ) ):
            temp=nodes_queue.pop( 0 )
            res.append( temp.val )
            if temp.left!=None:
                nodes_queue.append( temp.left )
            if temp.right!=None:
                nodes_queue.append( temp.right )

    return res

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值