二叉搜索树(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. 1506.01186-Cyclical Learning Rates for Training Neural Networks

    1506.01186-Cyclical Learning Rates for Training Neural Networks 论文中提出了一种循环调整学习率来训练模型的方式. 如下图: 通过循环的线 ...

  2. CSS属性相关

    ·一.宽和高 width属性可以为元素设置宽度. height属性可以为元素设置高度. 块级标签才能设置宽度,内联标签的宽度由内容来决定. 二.字体属性 1.文字字体 font-family可以把多个 ...

  3. soa 和微服务的区别

    soa beased applications are compromised of more loosely coupled componets that use an enterprise ser ...

  4. 接口测试(二) 优化项目分层及cookies值带入

    整个项目分层如图 然后上代码 #data_test.py from openpyxl import load_workbook import json import os class Date_tes ...

  5. Presto集群部署和配置

    参考文档:1.https://blog.csdn.net/zzq900503/article/details/79403949 prosto部署与连接hive使用                 2. ...

  6. docker+efk+.net core部署

    部署环境 centos7 本主要利用efk实现日志收集 一.创建docker-compose es地址:https://www.elastic.co/guide/en/elasticsearch/re ...

  7. java Graphics2D drawString()内容换行问题

    //字符串总宽度 private int getStringLength(Graphics g,String str) { char[] strcha=str.toCharArray(); int s ...

  8. 23. Merge k Sorted Lists (JAVA)

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  9. 生成式对抗网络(GAN)实战——书法字体生成练习赛

    https://www.tinymind.cn/competitions/ai 生成式对抗网络(GAN)是近年来大热的深度学习模型. 目前GAN最常使用的场景就是图像生成,作为一种优秀的生成式模型,G ...

  10. CVTE C/C++开发工程师笔试题(二)

    问题描述:打印重复元素 给定一个数组,内容可能包含1到N的整数,N最大为40000,数组可能含有重复的值,且N的取值不定.若只剩余5KB内存可用,请设计函数尽可能快的答应数组中所有重复的元素. voi ...