【程序员笔试】 树

算法+数据结构+树 按照复习顺序记录 2018年07月18日``09:11

  1. 遍历
  2. 转2叉
  3. 具体应用

——- 1

  • 二叉树的前序遍历、中序遍历、后序遍历。层次遍历。
  • 层次:
    按照树的层次结构,从上到下。
  • 前序:
    deal() 
    递归(左节点)
    递归(右节点)
    
  • 中序:
    递归(左节点)
    deal() 
    递归(右节点)
    
  • 后序:
    递归(左节点)
    递归(右节点)
    deal() 
    
  • 脑中模拟调用过程即可
    • 前序:根[左子树][右子树]
    • 中序:[左子树]根[右子树]
    • 后序:[左子树][右子树]根
    • 所以根据 ‘前+中’ ,‘后加中’ 是可以推算出树的结构
    • 所以将树线索化之后,‘前后’ 只有一个节点为null(因为根在首或尾),‘中’ 有两个。线索化就是将树的叶子节点的左右节点指向其某种遍历下的前后继节点。

—- 2
n树 转为2叉树
右边兄弟添加连线,转化为右子节点。
森林同。

  • 会有分析转化前后的节点关系的,如:
    • 节点有左节点,则该节点的中序前继没有右子节点
    • 转换后节点A是节点B的父节点的父节点,则转换前?
      • A是B的父节点,则转换器可能是 B是A的左子节点,B是A右边第一个兄弟。
      • A是B的父节点的父节点,则B是A的左子节点的左子节点,B是A的左子节点的右边第一个兄弟,B是A右边第一个兄弟的左子节点,B是A右边第二个兄弟。
      • 根据上面一条具体分析
    • 有序树转换后 前序等于 转换前 前序; 中序等于 转换前 后序。
      • 因为前序 递归调用右子节点时,次序没有变化
      • 因为中序 递归调用 根 右时,就是转换前的 左、兄弟、兄弟…
      • 转换前没有中序。

—– 3
树的度:子节点个数

  • 出度等于入度。据此可计算节点数。特别对于二叉树,2x+y+z*0=x+y+z-1,可得x=z-1;即 ‘出度为2的节点个数’ 为 ‘叶子节点数’ – 1。

—- 4

查找二叉树:左子树、右子树均小于根,且都为查找。

  • 构造方法:比较插入即可
  • 查找效率:nlgn,最差是链表为 n。
  • 查找序列:5,1,4,6是不合理的,因为6只会出现在5的右子树,而非1,4下代表的左子树。

平衡二叉树 :左右子树高度差小于1,且对左右子树也是如此。

  • 构造尽可能平衡的二叉树: 红黑树

哈夫曼树:哈夫曼编码,频率加权最小。频率越大根节点越近。

  • 构造方法:森林,每次取最小两个。

红黑树:平衡二叉树的一种实现。

  • 待细看

B树:磁盘。

  • 待细看
  • 创作人:李盟
  • 微信:supermans1201
  • 创作时间:2018年7月18日
  • 转载和使用请联系本人获得授权后并标明创作人,微信,时间还有此条。
    原文作者:supermans1202
    原文地址: https://www.jianshu.com/p/749f1f94428f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞