zoukankan      html  css  js  c++  java
  • 二叉树的遍历

    1.先序遍历:根节点->左子树->右子树

    1 # 先序打印二叉树(递归)
    2 def preOrderTraverse(node):
    3     if node is None:
    4         return None
    5     print(node.val)
    6     preOrderTraverse(node.left)
    7     preOrderTraverse(node.right)
     1 # 先序打印二叉树(非递归)
     2 def preOrderTravese(node):
     3     stack = [node]
     4     while len(stack) > 0:
     5         print(node.val)
     6         if node.right is not None:
     7             stack.append(node.right)
     8         if node.left is not None:
     9             stack.append(node.left)
    10         node = stack.pop()

    2.中序遍历:左子树->根节点->右子树

    1 # 中序打印二叉树(递归)
    2 def inOrderTraverse(node):
    3     if node is None:
    4         return None
    5     inOrderTraverse(node.left)
    6     print(node.val)
    7     inOrderTraverse(node.right)
     1 # 中序打印二叉树(非递归)
     2 def inOrderTraverse(node):
     3     stack = []
     4     pos = node
     5     while pos is not None or len(stack) > 0:
     6         if pos is not None:
     7             stack.append(pos)
     8             pos = pos.left
     9         else:
    10             pos = stack.pop()
    11             print(pos.val)
    12             pos = pos.right

    3.后序遍历:左子树->右子树->根节点

    1 # 后序打印二叉树(递归)
    2 def postOrderTraverse(node):
    3     if node is None:
    4         return None
    5     postOrderTraverse(node.left)
    6     postOrderTraverse(node.right)
    7     print(node.val)
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def postorderTraversal(self, root: TreeNode) -> List[int]:
            if root == None:
                return []
            pre = None
            res = []
            stack = [root]
            while stack:
                temp = stack[-1]  # 这里不能直接用pop,因为只有读取该节点的时候才要已经读取了的节点pop出栈
                if (temp.left == None and temp.right == None) or (pre and (pre == temp.left or pre == temp.right)):
                # 用pre来进行标志,由于是后序遍历,
                # 如果当前节点是叶节点(左右子节点为空),读取值,
                # 如果不是叶节点但是pre是他的子节点,
                # 就说明这个节点也是当前应该读取的点
                    res.append(temp.val)
                    pre = temp
                    stack.pop()
                else:  # 因为栈先进后出,因此子节点压入的顺序是先右后左。
                    if temp.right:
                        stack.append(temp.right)
                    if temp.left:
                        stack.append(temp.left)
            return res

    4.按层遍历:从上到下、从左到右按层遍历

    # 先进先出选用队列结构
    import queue
    def layerTraverse(head):
        if not head:
            return None
        que = queue.Queue()      # 创建先进先出队列
        que.put(head)
        while not que.empty():
            head = que.get()    # 弹出第一个元素并打印
            print(head.val)
            if head.left:       # 若该节点存在左子节点,则加入队列(先push左节点)
                que.put(head.left)
            if head.right:      # 若该节点存在右子节点,则加入队列(再push右节点)
                que.put(head.right)

     

    参考博客:https://www.cnblogs.com/icekx/p/9127569.html

     

  • 相关阅读:
    js中如何在不影响既有事件监听的前提下新增监听器
    史上最走心webpack4.0中级教程——配置之外你应该知道的事
    webpack4.0各个击破(10)—— Integration篇
    webpack4.0各个击破(9)—— karma篇
    webpack4.0各个击破(8)—— tapable篇
    webpack4.0各个击破(7)—— plugin篇
    MYSQL的安装
    数据库的分类
    python接口调用把执行结果追加到测试用例中
    python分布式接口,参数化实战二
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/12622808.html
Copyright © 2011-2022 走看看