zoukankan      html  css  js  c++  java
  • 二叉树 —— 按层遍历

    二叉树的遍历

    二叉树的遍历分先序、中序、后序和层次遍历。实现方式分递归和非递归方式。

    这里说说层次遍历。

    层次遍历是逐层访问二叉树的每个节点。属于广度优先。常常使用队列的方式。

    如图有以下一棵二叉树,它构建的队列形式为:

      

    1、先把根节点 1 放入队列,然后弹出,看看它有没有左右孩子,如果有,按顺序将左右孩子放入队列

    接着按顺序弹出  2 ,看  2  是否还孩子,如果有将2 的孩子加入队列。

    接着弹出 3 看其是否有孩子,如果有依次加入

    然后弹出4,看4 是否孩子节点,接着弹出5,看5 是否有孩子节点,如果有 就依次加入队列,显然本例中4 、 5 都没有孩子节点

    然后继续弹出6 ,6有孩子节点,依次加入队列,

    然后依次弹出7,8这样就对整个二叉树完成了遍历

     下面这道题就是根据上图这个方式完成的。

    有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。

    给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列

    本题的关键是 指定两个变量 last 和 nlast 来对节点进行跟踪。

    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class TreePrinter:
        def printTree(self, root):
            # write code here
            if root == None:
                return []
            queue = []     #定义一个队列,盛放节点
            result = []    #定义一个列表,盛放最终结果
            temp = []      #定义一个列表,盛放改行所有节点的值。
            last = nlast = root  #关键:定义两个变量 last nlast  其中:last 永远指向本行最右节点。
                                         #nlast 永远指向 下一行的最右节点 queue.append(root) #首先将root节点 加入队列
    while queue: node = queue.pop(0) #弹出队列的第一个节点 temp.append(node.val) #将弹出节点的值,放入temp 列表。 if node.left: queue.append(node.left) #如果弹出节点有左子树,那么将左孩子节点加入队列 nlast = node.left #因为nlast总是执行下一行的最右节点。所以要更新nlast指向。 if node.right: queue.append(node.right) #如果弹出节点有右子树,那么将右孩子加入队列 nlast = node.right # 同时再次更新nlast的指向。 if last == node: #如果弹出节点 == last 指向的节点(last总是指向本行最右节点) 说明一行结束了 last = nlast # 当前行已经结束了,所以更新last使其指向 下一行 的最右节点。 result.append(temp) #将上一行的所有节点的值的结果列表放入最终结果中。 temp = [] # 将temp置空,准备盛放下一行的所有节点的值 return result #返回最终结果
                                                                 
  • 相关阅读:
    Vue.js 父子组件间传递值
    Vue.js 单选绑定
    Vue.js 的v-for, v-html v-bind, v-show 实例
    Vue.js 表单input绑定
    Bootstrap tab
    Think PHP-- 笔记2
    MySql 修改登陆规则
    Think PHP--有趣的框架
    PHPStorm的xdebug配置
    伪类选择器
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/6118054.html
Copyright © 2011-2022 走看看