树是一种用于表达层级结构的数据结构。
树结构是实现高效算法与数据结构的基础,是信息处理与程序设计中不可欠缺的概念。
—————————————————————————————————————————————————————
第八章大概在两周前就看完了(真的还是“看”完了,到底理解了没有,记住了没有还真的不知道。。。)然后现在翻回来复习总结一下吧。。。。
—————————————————————————————————————————————————————
有根树的表达:
“左子右兄弟表示法”表示树。
struct Node{
int parent,left,right;
}T[MAX];
//或者
int parent[MAX],left[MAX],right[MAX];
引用u.parent即可知道各节点的父结点。子结点,兄弟结点同理。
不存在父结点就是根。不存在u.left就是叶子结点。不存在u.right就是最右侧子结点。
----
求各结点的深度(递归)
setDepth(u,p){
D[u]=p;
if T[u].right!=NIL
setDepth(T[u].right,p)
if T[u].left!=NIL
setDepth(T[u].left,p+1)
}
“左子右兄弟”如果右结点不空有兄弟则不改变深度直接调用,如果左结点不空则深度加一调用。
——————————————————————————————————————————————————————————————————————————————————————————————————————————
二叉树的表达
大致同上。。
——————————————————————————————————————————————————————————————————————————————————————————————————————————
树的遍历
Pregram(前序)、Inordor(中序)、Postorder(后序) 遍历均为递归遍历。
算法时间复杂度O(n)
pregram遍历
pregram (u){
if u==NIL
return
print u
pregram(T[u].left)
pregram(T[u].right)
}
Inorder遍历
Inorder (u){
if u==NIL
return
Inorder(T[u].left)
print u
Inorder(T[u].right)
}
postorder遍历
postorder(u){
if u==NIL
return
postorder(T[u].left)
postorder(T[u].right)
print u
}
——————————————————————————————————————————————————————————————————————————————————————————————————————————
树的重建
(已知树的前序遍历和中序遍历求树的后序遍历)
。。。。。讲不清楚啊 。。但是树上说的超清楚啊。。。
(对着书打一遍吧。。。。)
首先按前序遍历的顺序依次访问各结点。访问过程中,我们通过中序遍历得知各子树内中序遍历的顺序。从而重建以当前结点c为根的左右子树
也就是说,设前序遍历的当前结点为c,c在中序遍历中的位置是m,m左侧就是c的左子树,右侧就是右子树,然后同理递归!
。说是总结,其实并不算总结,只能说是抄书。。要说会了么,只能说懂了,并不能算是会。。说是刷书其实也只是抄书。。。。
没办法,感觉确实是智商不够然后做的所有的东西都是很机械的重复性工作,很难去举一反三。。emm然后就是,没有了。既然决定刷书写博客做总结,就算是抄,我也要抄完的。。。
还有就是。。还有40多天吧,其实没有40多天就是40天了吧。就是邀请赛。。花钱买资格,还不一定买的到。。没办法。。很菜很需要提高。喝个鸡汤:起点越低,进步越大。