二叉树_学习笔记
遍历二叉树:
前序:
基本原理:
先遍历所有左边的结点,然后再遍历右边的结点
基本写法:
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,直到没有排序节点为止