zoukankan      html  css  js  c++  java
  • 二叉树的遍历(python实现)

    一、层序遍历

    1.使用队列实现

    输入根节点,使用队列来遍历。先进的节点会先出去,出去时将自己的子节点放到队列中。

    def level(root):
    	if not root:
    		return None
    	queue=[root]
    	res=[]
    	while queue:
    		node = queue.pop(0)
    		res.append(node)
    		if node.left:
    			queue.append(node.left)
    		if node.right:
    			queue.append(node.right)
    return res
    

    2.使用递归实现

       result = []     
       def add_to_result(level, node):
            if not node:
                 return None  
            if level > len(result) - 1:
                 result.append([])			#到达新的一层的开头,要初始化一层
             result[level].append(node.val)
             add_to_result(level+1, node.left)
             add_to_result(level+1, node.right) 
      add_to_result(0, root)
      return result
    

    二、前序遍历

    1.递归

    遍历顺序:根--左子树--右子树

    res=[]
    def preorder(root):
    	if not root:
    		return None
    	res.append(root.val)
    	preorder(root.left)
    	preorder(root.right)
    

    2.迭代

    使用栈,先进后出,遍历左节点,知道叶子节点。然后出栈,遍历上一级的右节点,然后再出.......

      res = [ ]
      stack = []
      node = root
      while res or len(stack)>0:
           while node:
                 stack.append(node)
                  res.append(node.val)
                  node = node.left
            node = stack.pop()
            node = node.right
    

    三、中序遍历

    1.递归

    遍历顺序:左子树--根--右子树

    res=[]
    def midorder(root):
    	if not root:
    		return None
    	midorder(root.left)
    	res.append(root.val)			#调用顺序更改一下
    	midorder(root.right)
    

    2.迭代

      res = [ ]
      stack = []
      node = root
      while res or len(stack)>0:
           while node:
                 stack.append(node)
                 node = node.left					#到达最深的左节点
            node = stack.pop()
            res.append(node.val)					#出栈后再加入结果
            node = node.right
    

    四、后序遍历

    1.递归

    遍历顺序:左子树--右子树--根

          res=[]
            def postorder(root):
                if not root:
                    return None
                postorder(root.left)
                postorder(root.right)
                res.append(root.val)
            postorder(root)
    

    2.迭代

    和前序遍历思路一样,不过先遍历右子树,最后将结果逆序

            res=[]
            stack = []
            node = root
            if not root:
                return None
            while node or len(stack)>0:
                while node:
                    stack.append(node)
                    res.append(node.val)
                    node = node.right
                node = stack.pop()
                node = node.left
            return res[::-1]
    
  • 相关阅读:
    9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路(转)
    Path Sum(参考别人,二叉树DFS)
    tcp/ip
    常见Unix指令
    Pascal's Triangle II
    Implement strStr()
    LeetCode总结
    从LLVM源码学C++(一)
    面试题:1到N中,1出现的次数
    面试题:数组划分成两个子数组,和的差值的绝对值最小
  • 原文地址:https://www.cnblogs.com/zwrAI/p/14181868.html
Copyright © 2011-2022 走看看