二叉树

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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值