二叉树_学习笔记

遍历二叉树:
  前序:
    基本原理:
      先遍历所有左边的结点,然后再遍历右边的结点
    基本写法:

void qianBian(T *er)
{
if(er==null)
return;
printf("结点:"+er->data);
qianBian(er->left);
qianBian(er->right);

}

  中序:
    基本写法:

void qianBian(T *er)
{    
if(er==null)
return;
qianBian(er->left);
printf("结点:"+er->data);
qianBian(er->right);

}

  后序:
    基本写法:

void qianBian(T *er)
{    
if(er==null)
return;
qianBian(er->left);
qianBian(er->right);
printf("结点:"+er->data);
}

树的遍历:
  1.先根遍历(先根后子)->相当于前序遍历
    ABEFCDG
  2.后根遍历(先子后根)->相当于中序遍历
    EFBCGDA
森林的遍历:
  1.前序遍历:(每棵树使用先根遍历)
    ABCDEFGHJI
  2.后序遍历:(每棵树使用后根遍历)
    BCDAFEJHIG
转换
  树转换成二叉树
    1.加线,在所有兄弟节点之间加一条线
    2.去线,对树中每个节点,只保留它与第一个孩子节点的连线
      删除它与其他孩子节点之间的连线
    3.层次调整,将树顺时针旋转一定的角度
  森林转为二叉树
    1.将每棵树转换成二叉树
    2.第一个二叉树的根节点不动,然后依次连接其他的根节点
    3.层次调整,将树顺时针旋转一定的角度
  二叉树转换为树
    1.加线,若某个节点的左孩子节点存在,则这个左孩子的n个
      右孩子节点都作为此节点的孩子,将该节点与这些右孩子
      节点用线连接起来
    2.去线,删除原二叉树中所有结点与其右孩子结点的连线
    3.层次调整
二叉树转换为森林
    1.从根节点开始,若右孩子存在,则把与右孩子结点的连线
      删除,再查看分离后的二叉树,若右孩子存在,则连线删除
      直到所有右孩子连线都删除为止,得到分离的二叉树
    2.再将每棵树分离后的二叉树转换为树即可

赫夫曼树:
  定义:
    带权路径长度WPL最小的二叉树称做赫夫曼树
  带权路径长度:
    为该节点到树根之间的路径长度与节点上权的乘积
构造赫夫曼二叉树:
    1.先把有权的叶子简单升序排序
    2.取头两个 最小权的节点做新结点的子节点,相对小的在左节点
    3.用新结点替换原来的
    4.重复步骤2,直到没有排序节点为止

Hold on, everything is possible.
原文地址:https://www.cnblogs.com/student-note/p/6116764.html