算法原理与实践课件5_二叉树.pdf

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
极客班第二期市场营销计划 2015.7.28 4. Binary Tree ⼤纲 1. 树的概念 2. 树的深度遍历 3. 分治算法 4. 宽度优先 5. ⼆叉搜索树 6. Trie Tree 树的概念 树是⼀种能够分层储存数据的重要数据结构,树中的每个元素被称为树的节点, 每个节点有若⼲个指针指向⼦节点。从节点的⾓度来看,树是由唯⼀的起始节点 引出的节点集合。这个起始结点称为根(root)。树中节点的⼦树数⽬称为节点的 度(degree)。 在⾯试中,关于树的⾯试问题⾮常常见,尤其是关于⼆叉树,⼆叉搜索树的问 题。 ⼆叉树 ⼆叉树,是指对于树中的每个节点⽽⾔,⾄多有左右两个⼦节点,即任 意节点的度⼩于等于2 ⼆叉树的第i层⾄多有 2^{i-1} 深度为k的⼆叉树⾄多有 2^k-1 ⼯具箱: ⼆叉树概念 满⼆叉树(full binary tree) : 完全⼆叉树(complete binary tree) : 层数:对⼀棵树⽽⾔,从根节点到某个节点的路径长度称为该节点的层数(level) ,根节点为第 0层,⾮根节点的层数是其⽗节点的层数加1。 ⾼度:该树中层数最⼤的叶节点的层数加1 ,即相当于于从根节点到叶节点的最长路径加1 ⼆叉树的周游 以⼀种特定的规律访问树中的所有节点。常见的周游⽅式包括: 前序周游(Pre-order traversal) :访问根结点;按前序周游左⼦树;按前序周游 右⼦树。 中序周游(In-order traversal) :按中序周游左⼦树;访问根结点;按中序周游右 ⼦树。特别地,对于⼆叉搜索树⽽⾔,中序周游可以获得⼀个由⼩到⼤或者由⼤ 到⼩的有序序列。 后续周游(Post-order traversal) :按后序周游左⼦树;按后序周游右⼦树;访问 根结点。 DFS 三种周游⽅式都是深度优先算法(depth-first search) 深度优先算法最⾃然的实现⽅式是通过递归实现,事实上,⼤部分树相关的⾯试 问题都可以优先考虑递归。 深度优先的算法往往都可以通过使⽤栈数据结构将递归化为⾮递归实现。 层次周游 层次周游(Level traversal) :⾸先访问第0层,也就是根结点所在的层;当第i层的 所有结点访问完之后,再从左⾄右依次访问第i+1层的各个结点。 层次周游属于⼴度优先算法(breadth-first search)。 Binary Tree Traversal DFS 代码 ⾮递归实现 BFS代码 分治算法 分解(Divide):将原问题分解为若干⼦问题,这些⼦问题都是原 问题规模较⼩的实例。 解决(Conquer):递归地求解各⼦问题。如果⼦问题规模⾜够 ⼩,则直接求解。 合并(Combine):将所有⼦问题的解合并为原问题的解。 - ⼆分搜索 - ⼤整数乘法 - 归并排序 - 快速排序 Binary Search Tree ⼆分查找树(Binary Search Tree, BST)是⼆叉树的⼀种特例,对于⼆分 查找树的任意节点,该节点储存的数值⼀定⽐左⼦树的所有节点的值⼤ ⽐右⼦树的所有节点的值⼩(该节点储存的数值⼀定⽐左⼦树的所有节点 的值⼩⽐右⼦树的所有节点的值⼤)。 BST特性 由于⼆叉树第L层⾄多可以储存2^L个节点,故树的⾼度应在logn量级,因此,⼆ 叉搜索树的搜索效率为O(logn) 。 当⼆叉搜索树退化为⼀个由⼩到⼤排列的单链表(每个节点只有右孩⼦),其搜 索效率变为O(n) 。 Balanced Binary Tree Determine if a binary tree is a balanced tree. ⼀颗⼆叉树是平衡的,当且仅当左右两个⼦树的⾼度差的绝对值不超过 1,并且左右两个⼦树都是⼀棵平衡⼆叉树。 更好的实现? ⼀种改进⽅式是,可以考虑利⽤动态规划的思想,将TreeNode指针作为key ,⾼ 度作为value ,⼀旦发现节点已经被计算过,直接返回结果,这样,level函数对 每个节点只计算⼀次。 另⼀种更为巧妙的⽅法是,isBalanced返回当前节点的⾼度,⽤-1表⽰树不平 衡。将计算结果⾃底向上地传递,并且确保每个节点只被计算⼀次,复杂度 O(n)。 Is Binary Search Tree 错误例⼦: bool isValidBST(TreeNode* root) { if(root==NULL) return true;

文档评论(0)

小白兔 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档