摘要: 话说,上一次做开发还不知道是什么时候,但是当时却注册了一个域名,Coding.so 显而易见这个网站是做搜索的,而且是和程序员相关的一个搜索网站,但是确实离编程江湖有些遥远,所以做出来的效果也很差,但是感觉这个方向还是很值得探索的,在百度不给力,Google 被墙的情况下,如果能做出来一个程序员用的 阅读全文
posted @ 2018-11-27 14:37 栈客 阅读(313) 评论(2) 推荐(2) 编辑
摘要: 最近真的有些迷茫,本来想着进到一个公司和大家一起努力把产品做好。但是最后很失望,因为公司决策,产品最后没有推广即宣布失败!有时候想起来真的有些不甘心,来到这个公司一年,真的快成为全栈工程师了,从产品讨论,产品原型设计,再到开发!各个环节参与了很多。现在不得不离开,虽然公司没有裁员,还有其他的项目在推 阅读全文
posted @ 2016-04-18 11:05 栈客 阅读(17280) 评论(52) 推荐(16) 编辑


一直以来,二叉树相关算法问题是研发面试经常被问到的,所以对于程序员来说,尤其是做后端开发的程序员来说必须要掌握的。之前我对于二叉树的应用和算法都比较模糊,直到有次面试被问到如果一层一层去遍历一个二叉树,当时被问的有点懵,回来后恶补了一下二叉树


广度优先


广度优先搜索(Breadth First Search),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,上面二叉树的遍历顺序为:ABCDEFG.

可以利用队列实现广度优先搜索。


我们先看下面的一道题,层次遍历


何为层次遍历

说白了,就是一层一层、由上至下、由左至右的搜索遍历二叉树中的元素。

按照上图,输出的顺序是 1,2,3,4,5,6,7,8,9,10

解这道题的思路就是用到了广度(宽度)优先的算法

利用队列,依次将根,左子树,右子树存入队列,按照队列先进先出规则来实现层次遍历。

直接上代码:

def BFS(self,root):              #层次遍历核心代码
        if root == None:
            return
        queue = []
        queue.append(root)

        while queue:
            node = queue.pop(0)
            print(node.data)
            if node.left != None:
                queue.append(node.left)
            if node.right != None:
                queue.append(node.right)


利用list 做了一个队列,进行缓存,按照 根节点,左子树,右子树的方式进行存储,弹出,打印

深度优先

上面整体说了一下广度优先的遍历,那么与其相对应的还有深度优先的遍历方式,也是经常被用到

深度优先,简单讲是搜索包括从一条路径的起始点开始追溯,直到到达最后一个顶点,然后回溯,继续追溯下一条路径,直到到达最后的顶点,如此往复,直到没有路径为止

还是来看这张图

按照深度优先的输出顺序

A,B,D,E,C,F,G


深度优先遍历即是先按深度来遍历二叉树,包括:

前序遍历
遍历顺序 --> 根节点 -> 左子树 -> 右子树

中序遍历
遍历顺序--> 左子树 -> 根节点 -> 右子树

后序遍历
遍历顺序--> 左子树 -> 右子树 -> 根节点

每种顺序的遍历有轻微的差别

首先,定义 TreeNode:

class TreeNode:
    def __init__(self, value=None, left=None, right=None):
        self.value = value
        self.left = left  # 左子树
        self.right = right  # 右子树

实例化一个 TreeNode:

treeNode = TreeNode("A",
                 TreeNode("B",
                          TreeNode("D"),
                          TreeNode("E")
                          ),
                 TreeNode("C",
                          TreeNode("F"),
                          TreeNode("G")
                          )
                 )

前序遍历

def preTraverse(root):
    if root is None:
        return
    print(root.value)
    preTraverse(root.left)
    preTraverse(root.right)


输出顺序:

A,B,D,E,C,F,G


中序遍历

def midTraverse(root):
    if root is None:
        return
    midTraverse(root.left)
    print(root.value)
    midTraverse(root.right)

输出顺序:

D,B,E,A,F,C,G


后序遍历

def afterTraverse(root):    if root is None:        return    afterTraverse(root.left)    afterTraverse(root.right)    print(root.value)

输出顺序:

D,E,B,F,G,C,A


以上就是二叉树的广度优先遍历和深度优先遍历,在日常开发中,会经常遇到类似的场景应用,熟练掌握二叉树的相关算法也会对开发出高性能的程序提供很多帮助,

这期就介绍到这,下期见


福利:

关注公众号,回复python3 即可获得python3 全套教程

多多分享,福利多多


关注哦

👇

posted @ 2019-06-03 18:15 栈客 阅读(162) 评论(0) 推荐(1) 编辑
摘要: 话说,上一次做开发还不知道是什么时候,但是当时却注册了一个域名,Coding.so 显而易见这个网站是做搜索的,而且是和程序员相关的一个搜索网站,但是确实离编程江湖有些遥远,所以做出来的效果也很差,但是感觉这个方向还是很值得探索的,在百度不给力,Google 被墙的情况下,如果能做出来一个程序员用的 阅读全文
posted @ 2018-11-27 14:36 栈客 阅读(86) 评论(0) 推荐(0) 编辑
摘要: 前记:今天去面试了,感觉很不理想。回来总结一下,发现自己基础很差,感觉很烦恼!所以决定以后更要多努力一些,从今天开始坚持写技术博客,记录学习中的一些知识点,一些心得!希望与大家共勉,也希望大家多给建议!Window Phone 学习笔记(一)(一)Task 所有task都有Show方法,调用Show 方法启动任务,任务执行完毕都会返回应用。所有任务都需要用户手动点击启动。 1>SmsComposeTask:启动发送短信的任务,可以通过To、Body两个属性设置对方号码和短信内容。注意Show以后只是显示发送界面。View Code 1 SmsComposeTask t... 阅读全文
posted @ 2012-02-05 21:29 栈客 阅读(271) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示