二叉树的遍历(递归&非递归)

#二叉树的遍历(递归&非递归)
#定义二叉树结构:
class BinNode():
    def __init__(self,val):
        self.left=None
        self.right=None
        self.val=val

    #先序遍历
    ## 递归方法
    def preOrder(self,root):
        if root==None:
            return
        print(root.val)
        self.preOrder(root.left)
        self.preOrder(root.right)
    ## 非递归方法
    def preOrder(self,root):
        if root==None:
            return
        node=root
        stack=[node]
        while node or stack:
            while node:
                #从根节点开始,一直寻找左子树,并一直保存到栈里
                print(node.val)
                stack.append(node)
                node=node.left
            #该节点没有左子树了,查看该节点的右子树
            node=stack.pop()
            node=node.right

    #中序遍历
    ## 递归方法
    def inOrder(self,root):
        if root==None:
            return
        self.inOrder(root.left)
        print(root.val)
        self.inOrder(root.right)
    ## 非递归方法
    def inOrder(self,root):
        if root==None:
            return
        node=root
        stack=[node]
        while node or stack:
            while node:
                #从根节点开始,一直寻找左子树
                stack.append(node)
                node=node.left
            #该节点没有左子树了,查看该节点的右子树
            node=stack.pop()
            print(node.val)
            node=node.right

    #后序遍历
    ## 递归方法
    def postOrder(self,root):
        if root==None:
            return
        self.preOrder(root.left)
        self.preOrder(root.right)
        print(root.val)
    ##非递归方法
    def postOrder(self,root):
        if root==None:
            return
        stack1=[]
        stack2=[]
        node=root
        stack1.append(node)
        while stack1:
            #找到后续遍历的逆序,存储在stack2里
            node=stack.pop() stack1: 1,2,3—> stack2: 1,3,2
            if node.left:
                stack1.append(node.left)
            if node.right:
                stack1.append(node.right)
            stack2.append(node)
        while stack2:
            print(stack2.pop().val)

    ##层次遍历
    def levelOrder(self,root):
        if root==None:
            return
        stack=[root]
        while stack:
            temp=[]
            for i in range(len(stack)):
                print(stack[i].val)
                if stack[i].left:
                    temp.append(stack[i].left)
                if stack[i].right:
                    temp.append(stack[i].right)
            stack=temp

 

你可能感兴趣的:(DataStructure)