2020.1.14號講課

樹的基本概念:

  1. 樹的概念,包括無根樹和有根樹,結點的度
  2. 瞭解父親,祖先,葉節點,子節點,子樹的概念
  3. 完全二叉樹的概念

圖論中的樹:

  1. 樹的連通性
  2. 樹的邊數爲結點數減一
  3. 樹的三種遍歷方式
  4. 層次遍歷
  5. 已知先序遍歷和中序遍歷結果求後序遍歷
  6. 無根樹向有根樹的轉化
  7. 最近公共祖先問題(LCA)的樸素算法
  • 樹的構建,標準寫法:
//二叉樹類
typedef struct BiTNode{
    TElemType data;//數據
    struct BiTNode *lchild, *rchild;//左右孩子指針
} BiTNode, *BiTree;

在這裏插入圖片描述
在這裏插入圖片描述

  • 算法競賽中可以使用的寫法:
const int NN=2e5+5;

//無邊權
vector<int> ve[NN];
void add_edge(int x,int y){
	ve[x].push_back(y);
	ve[y].push_back(x);
}

//有邊權
#define Pr pair<int,int>
vector<Pr> ve[NN];
void add_edge(int x,int y,int val){
	ve[x].push_back(Pr(y,val));
	ve[y].push_back(Pr(x,val));
}
  • 三種遍歷插圖:
  1. 前序遍歷:
    在這裏插入圖片描述
  2. 中序遍歷:
    在這裏插入圖片描述
  3. 後序遍歷:
    在這裏插入圖片描述
  • 以某一節點爲根建立有根樹並刷新層次:
void dfs(int u,int f=u){
    fa[u]=f,dep[u]=dep[f]+1;
    for(int v:ve[u]){
        if(!dep[v]) dfs(v,u);
    }
}
  • 四種遍歷的算法:
void solve(int u){ cout<<u<<' ';}

void dfs(int u,int f=-1){
//dfs遍歷,先序遍歷 
	solve(u);
	for(int v:ve[u]) if(v!=f) dfs(v,u);
	//==: for(int v=ve[u][0],i=0;i<ve[u].size();i++,v=ve[u][i]) 
}

void bfs(int root){
//bfs遍歷,層次遍歷 
	queue<int> que;
	vector<int> vis(n+1);
	//~=:int vis[n+1];
	//for(int i=1;i<=n;i++) vis[i]=0;
	que.push(root),vis[root]=1;
	while(!que.empty()){
        int u=que.front();
        que.pop(),solve(u);
        for(int v:ve[u]) if(!vis[v]) vis[v]=1,que.push(v);
	}
}

//int ve[NN][2];
void Traverse(int &u,int t){
    if(!u) return ;
	if(t==1) solve(u);
    Traverse(ve[u][0]);
    if(t==2) solve(u);
    Traverse(ve[u][1]);
    if(t==3) solve(u);
}

數據結構中的樹:

  1. 優秀的查詢性質
  2. 二叉搜索樹&平衡樹
  3. 線段樹初識
  • 堆:
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 二叉搜索樹

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發佈了16 篇原創文章 · 獲贊 7 · 訪問量 395
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章