算法1000题Day2

#二叉树的前序遍历

#题目来自于leetcode上的第144号问题:给定一个二叉树,返回它的前序遍历

'''二叉树的前序遍历实现递归和非递归两种,前者递归调用preOrder函数,后者借用Stack来实现相同功能'''

#python实现二叉树

class BinaryTree():
    def __init__(self,rootNode):
        self.key = rootNode
        self.leftchild = None
        self.rightchild = None
        
    #insert lefchild and rightchild
    
    def insertLeft(self,newNode):
        if self.leftchild == None:
            self.leftchild = BinaryTree(newNode)
        else:
            newNode = BinaryTree(newNode)
            newNode.leftchild = self.leftchild
            self.leftchild = newNode
     
    def insertRight(self,newNode):
        if self.rightchild == None:
            self.rightchild = BinaryTree(newNode)
        else:
            newNode = BinaryTree(newNode)
            newNode.rightchild = self.rightchild
            self.rightchild = newNode
    
    #get leftchild and rightchild
    
    def getRight(self):
        return self.rightchild
    def getLeft(self):
        return self.leftchild
    def setRoot(self,key):
        self.key = key
    def getRoot(self):
        return self.key
    
#递归形式

def recusive_preOrder(root): #传入根节点
    if root != None: #当根节点不为空时
        print(root.getRoot()) #访问根节点
        recusive_preOrder(root.getLeft()) #访问左节点
        recusive_preOrder(root.getRight()) #访问右节点

recusive_preOrder(root)


#非递归形式:利用列表实现

def no_recusive_proOrder(root):
    alist = [None] #列表起到栈的作用,传入监听哨,跳出循环需要
    while root != None: #当前节点不为空
        print(root.getRoot()) #访问节点
        if root.getRight() != None:
            alist.append(root.getRight()) #将右节点存入栈中
        if root.getLeft() != None:
            root = root.getLeft() #节点替换
        else:
            '''思考一下:当某个节点左右节点均为空的时候
            它就是叶结点,当访问完它之后,下一步应该是回到它的兄弟结点中的右结点去对不对,而我们最近入传栈中的即是最近的右结点
            所以只需要从alist中pop出来这个元素作为root即可'''
            root = alist.pop()

no_recusive_proOrder(root)

test数据:

root = BinaryTree(1)
root.insertRight(2)
root.insertLeft(3)
root.getRight().insertRight(4)
root.getRight().insertLeft(5)
root.getLeft().insertLeft(7)
root.getLeft().insertRight(6)

 

你可能感兴趣的:(算法1000题Day2)