Binary Tree的3种非Recursive遍历

Binary Tree Preorder Traversal

Given a binary tree, return the preorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [1,2,3].

Note: Recursive solution is trivial, could you do it iteratively?

'''
Created on Nov 18, 2014

@author: ScottGu<gu.kai.66@gmail.com, 150316990@qq.com>
'''
# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    # @param root, a tree node
    # @return a list of integers
    def preorderTraversal(self, root):
        stack=[]
        vals=[]
        if(root==None): return vals
        node=root
        stack.append(node)
        while(len(stack)!=0):
            node=stack.pop()
            if(node==None): continue
            vals.append(node.val)
            stack.append(node.right)
            stack.append(node.left)
        
        return vals
        
View Code

 

Binary Tree Inorder Traversal

Given a binary tree, return the inorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [1,3,2].

Note: Recursive solution is trivial, could you do it iteratively?

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

'''
Created on Nov 18, 2014

@author: ScottGu<gu.kai.66@gmail.com, 150316990@qq.com>
'''
# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    # @param root, a tree node
    # @return a list of integers
    def inorderTraversal(self, root):
        stack=[]
        vals=[]
        visited={}
        if(root==None): return vals
        node=root
        stack.append(node)
        visited[node]=1
        while(len(stack)!=0):
            if(node.left!=None and visited.has_key(node.left)==False):
                node=node.left 
                stack.append(node)
                visited[node]=1
            else:
                node=stack.pop()
                if(node==None): continue
                vals.append(node.val)
                if(node.right!=None):
                    stack.append(node.right)
                    node=node.right
        return vals
  
View Code

 

Binary Tree Postorder Traversal

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

'''
Created on Nov 19, 2014

@author: ScottGu<gu.kai.66@gmail.com, 150316990@qq.com>
'''
# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    # @param root, a tree node
    # @return a list of integers
    def postorderTraversal(self, root):
        visited={}
        stack=[]
        vals=[]
        if(root==None): return vals
        node=root
        
        stack.append(node)
        visited[node]=1
        
        while(len(stack)!=0):
            node=stack[-1]
            if(node.left !=None and visited.has_key(node.left)==False):
                stack.append(node.left)
                visited[node.left]=1
                continue
            else:      
                if(node.right!=None and visited.has_key(node.right)==False):
                    stack.append(node.right)
                    visited[node.right]=1
                    continue
            node=stack.pop()
            if(node==None): continue
            vals.append(node.val)

        return vals
        
View Code

 

 

 

-- Scott, Programmer in Beijing [If you can’t explain it to a six year old, you don’t understand it yourself. —Albert Einstein ]
posted @ 2014-11-19 14:39  ScottGu  阅读(221)  评论(0编辑  收藏  举报