二叉搜索树(Binary Search Tree,又名排序二叉树,二叉查找树,通常简写为BST)定义如下:
空树或是具有下列性质的二叉树:
()若左子树不空,则左子树上所有节点值均小于或等于它的根节点值;
()若右子树不空,则右子树上所有节点值均大于或等于它的根节点值;
()左、右子树也为二叉搜索树; BST 的特性
按照中序遍历(inorder traversal)打印各节点,会得到由小到大的顺序。
在BST中搜索某值的平均情况下复杂度为O(logN)O(logN),最坏情况下复杂度为O(N)O(N),其中N为节点个数。将待寻值与节点值比较,若不相等,则通过是小于还是大于,可断定该值只可能在左子树还是右子树,继续向该子树搜索。
在balanced BST中查找某值的时间复杂度为O(logN)O(logN)。 BST 的作用
通过中序遍历,可快速得到升序节点列表。
在BST中查找元素,平均情况下时间复杂度是O(logN)O(logN);插入新节点,保持BST特性平均情况下要耗时O(logN)。(参考链接)。
和有序数组的对比:有序数组查找某元素可以用二分法,时间复杂度是O(logN);但是插入新元素,维护数组有序性要耗时O(N)。
 平衡二叉搜索树(Balanced Binary Search Tree,又称为AVL树,有别于AVL算法)是二叉树中的一种特殊的形态。二叉树当且仅当满足如下两个条件之一,是平衡二叉树:
空树
左右子树高度差绝对值不超过1且左右子树都是平衡二叉树 AVL树的高度为 O(logN)O(logN)
当AVL树有N个节点时,高度为O(logN)O(logN)。为何?
试想一棵满二叉树,每个节点左右子树高度相同,随着树高的增加,叶子容量指数暴增,故树高一定是O(logN)O(logN)。而相比于满二叉树,AVL树仅放宽一个条件,允许左右两子树高度差1,当树高足够大时,可以把1忽略。如图是高度为9的最小AVL树,若节点更少,树高绝不会超过8,也即为何AVL树高会被限制到O(logN)O(logN),因为树不可能太稀疏。严格的数学证明复杂,略去。 为何普通二叉树不是O(logN)O(logN)?这里给出最坏的单枝树,若单枝扩展,则树高为O(N)O(N): AVL树有什么用?
最大作用是保证查找的最坏时间复杂度为O(logN)。而且较浅的树对插入和删除等操作也更快。 AVL树的相关练习题
判断一棵树是否为平衡树
http://www.lintcode.com/problem/balanced-binary-tree/
提示:可以自下而上递归判断每个节点是否平衡。若平衡将当前节点高度返回,供父节点判断;否则该树一定不平衡。

• 二叉树(Binary Tree)问题的考点剖析

  • 第一类考察形态:求值,求路径类二叉树问题
  • 第二类考察形态:结构变化类二叉树问题
  • 第三类考察形态:二叉查找树(Binary Search Tree)类问题
    • 非递归(Iteration)版本的中序遍历(Inorder Traversal)

碰到二叉树的问题,就想想整棵树在该问题上的结果,和左右儿子在该问题上的结果之间的联系是什么。 考点都是基于树的深度优先搜索

第一类:

http://www.lintcode.com/en/problem/minimum-subtree/     Video 15:00

http://www.lintcode.com/en/problem/binary-tree-paths/     Video  27:00

http://www.lintcode.com/problem/lowest-common-ancestor/    Video  37:00

第二类:

http://www.lintcode.com/problem/flatten-binary-tree-to-linked-list/   Video  54:00

第三类:

https://www.lintcode.com/problem/kth-smallest-element-in-a-bst/   Video  1:19:30

http://www.lintcode.com/problem/binary-search-tree-iterator/
  非递归的中序遍历:自己实现一个stack

 Binary Search Tree Iterator
该 Iterator 算法即 non-recursion 的 inorder traversal,不仅仅适用于 BST,任何 Binary Tree 都可以
• stack 中保存一路走到当前节点的所有节点
• stack.peek() 一直指向 iterator 指向的当前节点
• hasNext() 只需要判断 stack 是否为空
• next() 只需要返回 stack.peek() 的值,并将 iterator 挪到下一个点,对 stack 进行相应的变化 挪到下一个点的算法如下:
• 如果当前点存在右子树,那么就是右子树中“一路向西”最左边的那个点
• 如果当前点不存在右子树,则是走到当前点的路径中,第一个左拐的点 相关题:
http://www.lintcode.com/problem/inorder-successor-in-binary-search-tree/
http://www.lintcode.com/problem/validate-binary-search-tree/ 不用递归
http://www.lintcode.com/problem/binary-tree-inorder-traversal/ 不用递归

Follow up:  Video  1:39:00

https://www.lintcode.com/problem/closest-binary-search-tree-value/     Video: 1:47:40

Follow up: https://www.lintcode.com/problem/closest-binary-search-tree-value-ii

Related Questions
Search Range in Binary Search Tree
• http://www.lintcode.com/problem/search-range-in-binary-search-tree/
Insert Node in a Binary Search Tree
• http://www.lintcode.com/problem/insert-node-in-a-binary-search-tree/
Remove Node in a Binary Search Tree
• http://www.lintcode.com/problem/remove-node-in-binary-search-tree/
• http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/BST-delete.html

一个狗家高频题... Leetcode 222

 # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None class Solution:
def countSubNodes(self, root):
if(root==None):
return 0
hl=0
rl=root.left
hr=0
rr=root.right
while(rl!=None):
hl+=1
rl=rl.left
while(rr!=None):
hr+=1
rr=rr.right
if(hl==hr):
return int(math.pow(2,hl+1))-1
else:
return self.countSubNodes(root.left) + self.countSubNodes(root.right) + 1 def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
return self.countSubNodes(root)

二叉树/DFS总结的更多相关文章

  1. UVA.839 Not so Mobile ( 二叉树 DFS)

    UVA.839 Not so Mobile ( 二叉树 DFS) 题意分析 给出一份天平,判断天平是否平衡. 一开始使用的是保存每个节点,节点存储着两边的质量和距离,但是一直是Runtime erro ...

  2. UVA.548 Tree(二叉树 DFS)

    UVA.548 Tree(二叉树 DFS) 题意分析 给出一棵树的中序遍历和后序遍历,从所有叶子节点中找到一个使得其到根节点的权值最小.若有多个,输出叶子节点本身权值小的那个节点. 先递归建树,然后D ...

  3. 二叉树 - DFS与BFS

    二叉树 - DFS与BFS ​ 深度优先遍历 (DFS Depth First Search) 就是一个节点不到头(叶子节点为空) 不回头 ​ 广度有点遍历(BFS Breadth First Sea ...

  4. Leetcode 257 Binary Tree Paths 二叉树 DFS

    找到所有根到叶子的路径 深度优先搜索(DFS), 即二叉树的先序遍历. /** * Definition for a binary tree node. * struct TreeNode { * i ...

  5. 选课 树形DP+多叉树转二叉树+dfs求解答案

    问题 A: 选课 时间限制: 1 Sec  内存限制: 128 MB 题目描述 大 学里实行学分.每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得相应的学分.学生最后的学分是他选修的各门 ...

  6. (二叉树 DFS 递归) leetcode 112. Path Sum

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  7. UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

    Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...

  8. 剑指Offer 从上往下打印二叉树(dfs)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印.   思路: 用一个队列来辅助,先压入根节点,设置一个指针记录队列头位置,判断队头指针有没有孩子,有压入左右孩子,,,操作完一次,队头出 ...

  9. (二叉树 DFS 递归) leetcode 101. Symmetric Tree

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

随机推荐

  1. splice() 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。

    var myFish = ["angel", "clown", "mandarin", "surgeon"]; //从第 ...

  2. jquery中text、html的区别

  3. 【转】未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。

    “/xxxxx”应用程序中的服务器错误. ------------------------------------------------------------------------------- ...

  4. java 下载网络文件

    1.FileUtils.copyURLToFile实现: import java.io.File; import java.net.URL; import org.apache.commons.io. ...

  5. java百度云推送

    实体类: import java.io.Serializable; import javax.persistence.Entity; /** * * @Version : 1.0 * @Author ...

  6. 【CPU微架构设计】利用Verilog设计基于饱和计数器和BTB的分支预测器

    在基于流水线(pipeline)的微处理器中,分支预测单元(Branch Predictor Unit)是一个重要的功能部件,它负责收集和分析分支/跳转指令的执行结果,当处理后续分支/跳转指令时,BP ...

  7. JUnit源码分析 - 扩展 - 自定义Rule

    JUnit Rule简述 Rule是JUnit 4.7之后新加入的特性,有点类似于拦截器,可以在测试类或测试方法执行前后添加额外的处理,本质上是对@BeforeClass, @AfterClass, ...

  8. JS 通过 navigator获取判断浏览器信息

    获取浏览器信息需要使用navigator.userAgent 对象 根据获取到的内容判断浏览器信息 亲身测试 navigator.userAgent IE 11  Mozilla/5.0 (Windo ...

  9. 网站图片的轮播JS代码

    这是几个网站的轮播JS效果,实现图片按照时间来切换,目前有几个站实现该功能,特别是浴室柜网站改版前,以下就是JS具体内容可以自己改下路径就可以用的linkarr = new Array();picar ...

  10. git 安装及常见问题处理

    卸载掉自带的: yum remove git 安装: yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-de ...