- 1、本文档共47页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 二叉树与树
第17讲:树的遍历与实现;回顾:哈夫曼树;回顾:哈夫曼树;例:已知一组权值
{2,3,5,7,11},
构造哈夫曼树的过程:;回顾:堆;回顾:优先队列;5.5 树;5.5 树;树--基本概念; 结点的度:该结点的孩子个数;
树的度:树中结点度的最大值;
兄弟:有共同的父结点;
无序树:兄弟间无左右次序;
有序树:兄弟分左右;
长子:最左子结点;
次子:长子的右邻;
左、右兄弟; 结点的度:该结点的孩子个数;
树的度:树中结点度的最大值;
例:已知一棵度为3的树,
度为0的结点有n0个、度为3的结点有n3个,
则度为2的结点有______________个.; //设:树类型 Tree , 结点类型Node
Tree consTree(Node p, Tree t1, …, Tree ti)
//以p为根,t1, …, ti为子树,建树
int isNull(Tree t) //判空
Node root(Tree t) //返回树t的根结点
Node parent(Node p) //求p的父亲结点
Tree leftChild(Tree t) //求t的长子树
Tree rightSibling(Tree t) //求t的右邻兄弟树
;树的遍历;树--深度优先遍历;树--先根遍历;// 先根遍历 -- 递归算法;树--非递归先根遍历;1) 置树根为当前结点p,
2) 当p≠Null, 访问p,
p进栈, p=p的长子;
重复, 直到p==Null;
3) 若栈不空,
p=栈顶的右兄弟,
栈顶退栈,返回2);
4) 若栈空且p==Null,结束。;void nPreOrder(Tree t);
{ Node p = root(t);
Stack s = createEmptyStack();
while(p!=Null)
{ visit(p); push(s, p);
p = leftChild(p); }
if( !isEmptyStack(s) )
{ p=top(s); p=rightSibling(p); pop(s); }
}while( !isEmptyStack(s) || p!=Null)
};先根序列:
;树--深度优先遍历;树--后根遍历;树--后根遍历; 后根遍历,非递归思想:;1) 置树根为当前结点p,
2) 当p≠Null,
p进栈, p=p的长子;
重复, 直到p==Null;
3) 若栈不空,访问栈顶,
p=栈顶的右兄弟,
栈顶退栈,返回2);
4) 若栈空且p==Null,结束。;例,后根中,x是y的子孙的充要条件:
post(y) – desc(y) ≤post(x) <post(y);树--广度优先遍历;广度优先序列:;void levelOrder( Tree t)
{ Node p = root(t);
Queue Q = createEmptyQueue();
enQueue(Q, p);
while(!isEmptyQueue(Q))
p = frontQueue(Q);
visit(p); deQueue(Q);
p= leftChild(p);
while(p != Null)
{ enQueue(Q, p);
p= rightSibling(p);}
} }
;5.6 树的实现;1.父亲数组表示法;1.父亲数组表示法;1.父亲数组表示法;1.父亲数组表示法;例,“父亲数组” 表示的树中(先根顺序),
求下标为p的结点的右兄弟。;例, “父亲数组” 表示的树中(先根顺序),
求下标为p的结点的长子。;5.6 树的实现;2.子表表示法;A;0;2.子表表示法;2.子表表示法;2.子表表示法;2.子表表示法;int parent_chitree(PChiTree t, int p)
{ int i; struct EdgeNode * v;
for( i=0; i< t->n; i++)
v= t->nodelist[i].children;
while(v !
文档评论(0)