【算法与数据结构---二叉树】

遍历

(一定要写熟)
前序遍历:中左右
中序遍历:左中右
后序遍历:左右中

非递归方式
中序遍历:从根节点开始(1)左树的左边界进栈,直到没有左树的节点,(2)然后依次弹出,打印,若弹出的节点有右子树,对其右子树重复(1)(2)的过程

宽度优先遍历:从左到右的顺序将节点放入队列(FIFO),然后弹出,每弹出一个节点,再将其左右节点放入队列,再继续淡出。。。
题目:求一棵树的最大宽度

  • 队列+哈希表:(1)从左到右依次将节点放入队列,(2)并将节点在第几层存入哈希表(key为节点,value层数),(3)弹出节点并判断是否在当前层,若在,则计数当前层的节点数,若不在则更新当前层,并开始新一层的计数;将弹出节点的左右节点放入队列,重复(2)
  • 队列:两个节点指针用来指示当前层的最后一个节点(curEnd)和下一层(nextEnd)的最后一个节点,初始值curEnd为根节点,nextEnd为null,一个计数变量num
    (1)从左到右依次 将节点放入队列;(2)弹出节点,若弹出节点是当前层的最后一个节点(curEnd),则判断num和max中的最大值并存入max,并将nextEnd的值赋给curEnd,表示当前层更新到下一层,nextEnd更新为null;若不是,则num++(3)将弹出节点的左右节点放入队列,并将队列中最后一个节点作为nextEnd,重复(2)

搜索二叉树BST

定义:对于每一棵子树,它的左子树的节点都比它小,右子树的节点都比它大
题目:判断一个树是否是搜索二叉树:
一、中序遍历的结果是升序->搜索二叉树 (存入集合检查 / 动态检查)
二、递归:左树是搜索二叉树,右树是搜索二叉树,左树最大值<当前节点的值<右树最小值->true
三、递归:若每个节点的左孩子小于该节点,右孩子大于该节点,则为BST。前序遍历每个节点,比较每个节点是否在min~max的范围内,对于左节点,min为long类型最小值(Long.MIN_VALUE),max为parent节点的值;对于右节点,max为long类型最大值(Long.MAX_VALUE),min为parent节点的值。根节点的min 和max分别为long的最小、最大值。

完全二叉树

题目:判断是否为完全二叉树:
宽度遍历:
(1)任一节点只有右孩子,没有左孩子->false
(2)若(1)不违规,若第一个左右子不全(没有右孩子)的节点,接下来所有节点都是叶子节点->true

满二叉树

统计深度h,节点个数N,若N= 2^h - 1,则该树为满二叉树

平衡二叉树

对于任一子树,左右子树的高度差不超过1
判断是否为平衡二叉树:左子树平衡、有子树平衡、左右子树高度差不超过1->平衡二叉树

树形DP(动态规划)(难点)

题目1:给定一棵树,和其中两个子树root1, root2,找出它们的最低公共祖先
法1:(1)将所有节点放入哈希表(key为该节点,value为父节点),即将当前节点放入value,将其左右子节点放入key;(2)从root1向上遍历,即访问root1及其所有祖先节点,并将这些节点放入HashSet中,到根节点结束(3)从root2开始向上遍历,第一个包含在HashSet中的root2的祖先节点就是它们的最低公共祖先节点。
法2:递归
情况1:root1是root2的祖先或root2是root1的祖先
情况2:root1和root2不互为祖先
(1)若树的根节点head为null或root1或root2,则直接返回根节点
(2)将树的左子树、root1、root2递归,求在左子树中,两个root的最低公共祖先
(3)将树的右子树、root1、root2递归,求在右子树中,两个root的最低公共祖先
(4)若左右子树中的最低公共祖先都不为null,则表明当前节点为祖先,返回head,即:左右子树分别包含root1,root2(不是对应关系)
(5)左右子树中的最低公共祖先有一个为null,则表示该子树中不包含任何一个root,则返回不为null的最低公共祖先

题目2
前驱节点:中序遍历中一个节点的前一个节点。
后继节点:中序遍历中一个节点的下一个节点。
整棵树的最右节点没有后继节点
若x有右树,它的后继节点是右树上的最左节点
若x无右树,向parent节点访问,直到x是某个parent节点左子树,该parent是x的后继节点(此时x是parent左子树的最右节点)

题目3
二叉树的序列化和反序列化
即一颗树变成字符串形式,再从字符串形式变成树
序列化:前序遍历:节点不为null则将值放入字符串str,节点为null则存入符号#,每个符号用_(或其他符号)隔开,递归左子树、右子树,并将返回值加到str
反序列化:将str按照间隔符号切割(split),并将所有元素依次放入队列。对这个队列进行递归,取出队列元素,若为#则返回null,否则将值赋给Node;将剩余队列的递归赋值给Node.left和Node.right,返回Node

题目4
一张纸条,对着N次,返回折痕的凹凸序列:
可看作一棵N层的二叉树,头节点是凹,每个节点的左孩子都是凹,右孩子都是凸,纸条的凹凸序列就是二叉树的中序遍历

  • 23
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值