1,引入树及其相关知识
(a)–空二叉树;
(b)–只有一个根结点的二叉树;
©–只有左子树;
(d)–只有右子树;
(e)–完全二叉树;
##相关术语:
树的结点(node):包含一个数据元素及若干指向子树的分支;
孩子结点(child node):结点的子树的根称为该结点的孩子;
双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲;
兄弟结点:同一双亲的孩子结点; 堂兄结点:同一层上结点;
祖先结点: 从根到该结点的所经分支上的所有结点
子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙
结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推;
树的深度:树中最大的结点层
结点的度:结点子树的个数
树的度: 树中最大的结点度。
叶子结点:也叫终端结点,是度为 0 的结点;
分枝结点:度不为0的结点;
有序树:子树有序的树,如:家族树;
无序树:不考虑子树的顺序;
2, 算法即代码实现
##二叉树遍历
(我的记忆方法是什么序遍历就把根的位置放哪里,另外当让你求是那种遍历方式时 题目不会说求中序 因为只有中序才能找到根的位置方便把大的左枝与右枝找出来)
先序遍历: 根左右 1245367
中序遍历: 左根右 4251637
后序遍历: 左右根 4526731
层次遍历:1234567
##最小生成树和最短路区别:
最小生成树能够保证整个拓扑图的所有路径之和最小(即全局最短),但不能保证任意两点之间
是最短路径。最短路是从一点出发,到达目的地的路径最小。某一点到任意其他点的距离最短。
学姐说你学习一个代码要知道它是干什么的;
##例题
哈夫
Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer length Li (1 ≤ Li ≤ 50,000) units. He then purchases a single long board just long enough to saw into the N planks (i.e., whose length is the sum of the lengths Li). FJ is ignoring the “kerf”, the extra length lost to sawdust when a sawcut is made; you should ignore it, too.
FJ sadly realizes that he doesn’t own a saw with which to cut the wood, so he mosies over to Farmer Don’s Farm with this long board and politely asks if he may borrow a saw.
Farmer Don, a closet capitalist, doesn’t lend FJ a saw but instead offers to charge Farmer John for each of the N-1 cuts in the plank. The charge to cut a piece of wood is exactly equal to its length. Cutting a plank of length 21 costs 21 cents.
Farmer Don then lets Farmer John decide the order and locations to cut the plank. Help Farmer John determine the minimum amount of money he can spend to create the N planks. FJ knows that he can cut the board in various different orders which will result in different charges since the resulting intermediate planks are of different lengths.
Input
Line 1: One integer N, the number of planks
Lines 2… N+1: Each line contains a single integer describing the length of a needed plank
Output
Line 1: One integer: the minimum amount of money he must spend to make N-1 cuts
Sample Input
3
8
5
8
Sample Output
34
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
//#define ll long long
int main()
{
priority_queue<int ,vector<int>,greater<int> >Q;
int n,p,q,x;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&p);
Q.push(p);
}
long long ans=0;
while(Q.size()>=2)
{
p=Q.top();
Q.pop();
q=Q.top();
Q.pop();
x=p+q;
Q.push(x);
ans+=x;
}
printf("%lld\n",ans);
return 0;
}
基本就是哈夫树模板 注意ans开大一点 不然会Wrong Answer;