数据结构与算法分析 收获总结 第6章 树

说实话看见书上空白的笔记真以为老师没讲这章,一看到期末的考试范围有这章才意识到可能又是自己上课划水了。看了下,还好内容不多,十页就结束了。
重点:
1.学会树的前序(先根)遍历,后序遍历,与二叉树差不多。不必掌握中序遍历(有很多随意的定义)
如:前序遍历打印树中结点:

void printhelp(GTNode<E>*root){
  if(root->isLeaf())cout<<"Leaf:";
  else cout<<"Internal:";
  cout<<root->value()<<"\n";
  //从最左子结点开始,依次处理下一个子结点,直到查找到下一个子结点的next函数返回NULL为止
  for (GTNode<E>temp=root->leftmostChild();temp!=NULL;temp->rightSibling())
  printhelp(temp);
}

2.父指针表示法:每个结点只保存一个指针域,指向其父结点
对于不相交集合,希望提供两种操作:
(1)判断两个结点是否在同一集合中:FIND
(2)归并两个集合:UNION
并查算法用一颗树代表一个集合
通过函数differ检查一个等价对中的两个元素是否在同一棵树中,如果是,由于它们已经在同一个等价类中,不需要变动;否则就用UNION归并两个等价类。(某两个结点之间有一条通路,就认为这两个结点是等价的,等价边即相连的边集合的子集称为连通分支,等价对就是图中边的集合,并查集目的是快速地将结点集合划分为代表连通分支的不相交集合,也用在计算图的最小生成树的Kruskal算法)
等价类处理和路径压缩有点没看懂,战略性放弃了.
3.树的实现:
(1)子结点表表示法 P136
下标 Value Par …
(2)左子结点/右兄弟结点表示法
下标 left value par right
(3)动态结点表示法
将链接表示法扩展到树
i.树的动态结点表示法
val size … … … …表示指向子结点的val
ii.带有子结点指针链表的动态树表示法
val 指针域 指针域指向一个空的域-指针,再由该指针指向一个子结点,每个子结点都被一个空的域-指针的指针所指向
4.学会树,二叉树,森林的转化:
(1)树->二叉树:兄弟相连,断掉除最左子结点的所有子结点
(转化后的二叉树根结点一定没有右子树)
(2)森林->二叉树:每棵树转化为二叉树,再根的右子树连接新树(loop)
(3)二叉树->树:即反过程,向右方向与父连,与兄弟断
(4)二叉树->森林:根右子树全断开
5.K叉树:与二叉树类似
6.树的顺序表示法

         A
   B         C
     D     E    F
          G    H I

i.假定/代表空指针NULL:AB/D//CEG///FH//I//
ii.A’B’/DC’E’G/F’HI (无’表示无子结点)
iii.11001100100

   
         R
    A          B
  C D E        F         

iiii.用特殊标记 )来标明子结点表的结束,所有叶结点后面都跟着一个),因为它们没有子结点,如果一个子结点是其父结点的最后一个子结点,则其后面将有两个或更多连续的)
RAC)D)E))BF)))
F后面有三个),因为它既是叶结点,也是B的最右子树的最后结点,同时又是R的最右子树的最后结点

你可能感兴趣的:(数据结构)