1. 程式人生 > >面試題目整理--20181109--二叉樹中序遍歷非遞迴實現

面試題目整理--20181109--二叉樹中序遍歷非遞迴實現

非遞迴實現二叉樹的中序遍歷

首先看一下遞迴方式的實現方式:

class TreeNode:
    left = None
    right = None
    var = 0
    def __init__(self, var):
        self.var = var
        
def inOrder(root):
    if root == None: 
        return
    inOrder(root.left)
    print (root.var)
    inOrder(root.right)

如果傳入節點為空則直接返回,否則遞迴呼叫inOrder(root.left)即不斷搜尋二叉樹最左邊節點,當找到最左邊節點時,root.left==null呼叫inorder直接返回,繼續執行print函式,輸出之後繼續執行inOrder(root.right) 即當輸出某個節點時,指標應該指向輸出節點的右節點

def inOrder2(root):
    if root == None:
        return
    #指標
    p = root
    #棧
    s = []
    while p!=None or len(s)>0:
        #將二叉樹的從根到最左節點路徑上節點不斷入棧
        if(p!=None):
            s.append(p)
            p = p.left
        else:
            #從棧中彈出
            p = s.pop()
            print (p.var)
            #當列印完畢只有  指標指向列印節點的右節點
            p = p.right

二叉樹的先序遍歷遞迴非遞迴實現方式:

遞迴方式實現先序遍歷:

def preOrder(root):
    if root == None:
        return
    print(root.var)
    preOrder(root.left)
    preOrder(root.right)

當傳入節點非空時,立刻列印該節點,然後依次遞迴遍歷left  right節點 先訪問根 然後一直訪問根的左節點,直到某個節點左節點為空,此時訪問該節點的右節點

非遞迴實現方式:

def preOrder2(root):
    if root == None:
        return
    p = root
    s = []
    s.append(p)
    while len(s)>0:
        p = s.pop()
        print(p.var)
        if p.right != None:
            s.append(p.right)
        if p.left != None:
            s.append(p.left)

首先將根節點入棧,然後彈出輸出節點值,依次判斷右 左節點是否為空,當節點非空時,依次入棧,則出棧順序對應左右,即實現了先序遍歷。

二叉樹的後序遍歷遞迴非遞迴實現方式:

使用一個指標來遍歷樹節點   使用一個指標來記錄上一個被訪問的節點   當訪問某個節點時,首先入棧,若該節點左右孩子均為空可以直接訪問,若左右孩子其一為空並且上一個訪問的節點是其左右孩子則該節點也可以訪問,若該節點左右孩子非空,則依次將右左節點入棧。