遍历二叉树的神级方法(Morris遍历)

题目:

给定一颗二叉树的头节点head,完成二叉树的先序、中序和后序遍历,如果二叉树的节点为N,则要求时间复杂度为O(N),额外空间复杂度为O(1)

Morris遍历

代码如下:

def getMorris(Node head):
    if head == None:
        return

    cur = head
    mostRight = None

    while cur!=None:

        mostRight = cur.left
        if mostRight!=None:
            while mostRight!=None and mostRight.right!=cur:
                mostRight = mostRight.right

            if mostRight.right == None:
                mostRight.right = cur
                cur = cur.left
                continue
            else:
                mostRight.right = None
    

        cur = cur.right

        
# morries 前序遍历

def morriesPre(Node head):
    if head == None:
        return 

    cur = head
    mostRight = None

    while cur!=None:
        mostRight = cur.left

        if mostRight!=None:

            while mostRight!=None and mostRight.right!=cur:
                mostRight = mostRight.right

            if mostRight==None:
                mostRight.right = cur
                print(cur.value)
                cur = cur.left
                continue
            else:
                mostRight == None

        else:
            print(cur.value)

        
        cur = cur.right

 
# morries 中序遍历

def morriesIn(Node head):

    if head == None:
        return 

    cur = head
    mostRight = None

    while cur!=None:
        mostRight = cur.left

        if mostRight!=None:

            while mostRight!=None and mostRight.right!=cur:
                mostRight = mostRight.right

            if mostRight==None:
                mostRight.right = cur
                print(cur.value)
                cur = cur.left
                continue
            else:
                mostRight == None

        
        print(cur.value)
        cur = cur.right
# morries 后序

def morrieslast(Node head):
    
    if head == None:
        return
    
    cur = head
    mostRight = None
    
    while cur!=None:
        mostRight = cur.left
        if mostRight != None:
            while mostRight!=None and mostRight.right!=cur:
                mostRight = mostRight.right
                
            if mostRight == None:
                mostRight.left = cur
                cur = cur.left
                continue
            else:
                mostRight.right = None
                printEdge(cur.left)
                
        printEdfe(head)
        cur = cur.right
        
def printEdge(Node head):
    tail = reverseEdge(head)
    cur = tail
    while cur!=None:
        print(cur.value)
        cur = cur.right
        
    reverseEdge(tail)
    
def reverseEdge(Node from_):
    pre = None
    next_ = None
    
    while from_!=None:
        next_ = from_.right
        from_.right = pre
        pre = from_
        from_ = next_
        
    return pre

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值