- 树的存储之双亲表示法
特点:可以很简单的根据数组中的元素找到父亲节点,但是要找孩子节点就需要遍历整个二叉树。 - 孩子表示法
节点存储的是其本身的值和孩子的位置信息。(同构)
或者节点存储其本身的值和孩子个数及孩子的位置信息(异构)
数组表示,每个数组的元素是一个链表。(孩子表示法) - 孩子兄弟法(重点)
讲森林转换成二叉树,左边是孩子节点,右边是兄弟节点。
##孩子兄弟法的一些操作‘’ 第一个孩子节点
TreeNode* FirstChild(TreeNode *t) { //如果树是空树 if(t == NULL) return NULL; return t->fristChild; }
第一个兄弟节点
TreeNode* NextSibling(TreeNode *t) { if(t == NULL) return NULL; return t->nextSibling; }
查找某个节点
TreeNode *Find(TreeNode *t, ElemType key) { if(t == NULL) return NULL; if(t->data == key) return t; TreeNode *p = Find(t->fristChild, key); if(p != NULL) return p; return Find(t->nextSibling, key); }
寻找父亲节点(不同于二叉树的查找父亲节点)
/寻找父亲节点并不是二叉树的的父亲节点,而是其上一层的第一个节点(距离树最近的节点)
TreeNode* Parent(TreeNode *t, TreeNode *p) //p是要查找的节点,t是上一层的第一个节点
{
if(t == NULL || p == NULL || t == p)
return NULL;
TreeNode *q = t->fristChild;
TreeNode *parent = NULL;
while(q != NULL && q != p){
parent = Parent(q, p); //沿着左孩子一直找下去
if(parent != NULL)
return parent; //到达这里证明左孩子已经找完了
q = q->nextSibling;//找相对应的右兄弟节点
}
if(q != NULL && q == p)
return t; //返回真正的父亲节点
return NULL;
}