二叉搜索树(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. 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”

    来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...

  2. 一个简单的struts2上传图片的例子

    https://www.cnblogs.com/yeqrblog/p/4398914.html 在我的大创项目中有对应的应用

  3. servlet的继承关系

    一.servlet的继承关系 1.servlet程序是sun公司开发用于web资源技术,任何一个类只需要实现了servlet接口,那么就可以成为servlet程序 2.继承体系: ---------- ...

  4. Mysql JSON字段提取某一个属性值的函数

    mysql从5.7开始才支持JSON_EXTRACT等 JSON相关的函数, 项目里用到的mysql是5.6的,需要提取JSON字段里某一个属性值进行统计, 自己写了一个笨的提取方法: CREATE ...

  5. css第二天

    二丶 1.字体属性font: 字体名称(font-family)字体大小(font-size):pc中通常,字体大小表示为12px,14px.移动设备中通常表示为0.57rem.字体粗细(font-w ...

  6. pytorch之张量的理解

    张量==容器 张量是现代机器学习的基础,他的核心是一个容器,多数情况下,它包含数字,因此可以将它看成一个数字的水桶. 张量有很多中形式,首先让我们来看最基本的形式.从0维到5维的形式 0维张量/标量: ...

  7. 基于SDL2实现俄罗斯方块

    俄罗斯方块有多种旋转规则,我这里采用的是SRS.如果要改变旋转规则的话也很方便. SRS: 内容后续补充.. 代码:https://github.com/CknightX/sdl_Tetris 素材来 ...

  8. 字节、字、bit、Byte、byte的关系区分

    1.位(bit)             来自英文bit,音译为"比特", 表示二进制位.位是计算机内部数据存储最小单位,11010100是一个8位二进制数.一个二进制位只可以表示 ...

  9. A Boring Problem UVALive - 7676

    16年北京现场赛的题,全场过的队30+. 初看只知道 O(N^2logK)的暴力,以为是什么变换. 仔细发现活用 二项式定理 就行. #include <bits/stdc++.h> us ...

  10. linklist和arraylist区别

    ArrayList更适合读取数据,linkedList更多的时候添加或删除数据.