最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

二叉樹入門和刷題詳解

 更新時間:2023年07月25日 08:39:37   作者:拾墨、  
這篇文章主要介紹了二叉樹入門和刷題詳解的相關(guān)資料,需要的朋友可以參考下

一些定義

  • 先序,中序,后序遍歷中的序是遍歷根的順序

  • 層序遍歷就是這個數(shù)的bfs序列

樹的存儲

有很多種存儲方式,一般用結(jié)構(gòu)體數(shù)組。
數(shù)組下標(biāo)對應(yīng)這個數(shù)的結(jié)點,既可以存左兒子右兄弟又可以存左兒子右兒子。
下面來看一些題真切的感受一下代碼

例題1 遍歷完全二叉樹

http://oj.daimayuan.top/course/7/problem/430

題目

給你一棵 n 個節(jié)點的完全二叉樹,節(jié)點的編號為 1 到 n,二叉樹的根為 1 號節(jié)點。編號為 i (1≤i≤n) 的節(jié)點的左兒子如果存在的話,編號為 i+i;編號為 i (1≤i≤n) 的節(jié)點的右兒子如果存在的話,編號為 i+i+1。

現(xiàn)在請你求出這棵完全二叉樹的先序、中序和后序遍歷的結(jié)果。

輸入格式
一行一個整數(shù) n。

輸出格式
輸出三行,每行 n 個數(shù)代表一種遍歷的結(jié)果。

第一行為先序遍歷的結(jié)果,第二行為中序遍歷的結(jié)果,第三行為后序遍歷的結(jié)果。

樣例輸入
7
樣例輸出
1 2 4 5 3 6 7
4 2 5 1 6 3 7
4 5 2 6 7 3 1
數(shù)據(jù)規(guī)模
對于所有數(shù)據(jù),保證 1≤n≤1024。

代碼

highlighter- cpp

#include<bits/stdc++.h>

using namespace std;

int a[2000];
int n;

void preorder(int x) //先序
{
	if(x>n) return;
	cout<<x<<" ";
	preorder(2*x);
	preorder(2*x+1);
}

void inorder(int x) //中序
{
	if(x>n) return;
	inorder(2*x);
	cout<<x<<" ";
	inorder(2*x+1);
}

void postorder(int x) //后序 
{
	if(x>n) return;
	postorder(2*x);
	postorder(2*x+1);
	cout<<x<<" ";
}


int main()
{
	cin>>n;
	preorder(1);
	cout<<endl;
	inorder(1);
	cout<<endl;
	postorder(1);
	return 0;
}

例題2遍歷一般二叉樹

http://oj.daimayuan.top/course/7/problem/431

題目

給你一棵 n 個節(jié)點的二叉樹,節(jié)點的編號為 1 到 n,二叉樹的根為 1 號節(jié)點。請你求出這棵二叉樹的先序、中序和后序遍歷的結(jié)果。

輸入格式
第一行一個整數(shù) n 表示節(jié)點數(shù)。

接下來 n 行,每行兩個整數(shù),第一個整數(shù)表示 i 號節(jié)點的左兒子的編號,第二個整數(shù)表示 i 號節(jié)點的右兒子的編號,如果某個數(shù)字為 0 表示沒有對應(yīng)的子節(jié)點。

輸入保證是一棵二叉樹。

輸出格式
輸出三行,每行 n 個數(shù)代表一種遍歷的結(jié)果。

第一行為先序遍歷的結(jié)果,第二行為中序遍歷的結(jié)果,第三行為后序遍歷的結(jié)果。

樣例輸入
4
2 3
0 0
4 0
0 0
樣例輸出
1 2 3 4
2 1 4 3
2 4 3 1
數(shù)據(jù)規(guī)模
對于所有數(shù)據(jù),保證 1≤n≤1024。

代碼

highlighter- cpp

# include<bits/stdc++.h>

using namespace std;
typedef pair<int,int> pii;
const int N = 1200;

pii a[N];
int n;

void preorder(int x)
{
	if(x>n || x == 0) return ;
	cout<<x<<" ";
	preorder(a[x].first);
	preorder(a[x].second);
}

void inorder(int x)
{
	if(x>n || x == 0) return ;
	inorder(a[x].first);
	cout<<x<<" ";
	inorder(a[x].second);
}

void postorder(int x)
{
	if(x>n || x == 0) return ;
	postorder(a[x].first);
	postorder(a[x].second);
	cout<<x<<" ";
}


int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x,y;scanf("%d%d",&x,&y);
		a[i] = {x,y};
	}
	preorder(1);cout<<endl;
	inorder(1);cout<<endl;
	postorder(1);
	return 0;
}

例題3 二叉樹的最近公共祖先 (lca)

http://oj.daimayuan.top/course/7/problem/457

題目

給你一棵 n 個節(jié)點的二叉樹,節(jié)點的編號為 1 到 n,二叉樹的根為 1 號節(jié)點。

讀入 u,v,請求出 u 號節(jié)點和 v 號節(jié)點的最近公共祖先(Lowest Common Ancestor)。

如果 x 號節(jié)點既是 u 號節(jié)點的祖先也是 v 號節(jié)點的祖先,則稱 x 號節(jié)點是 u 號節(jié)點和 v 號節(jié)點的公共祖先。

如果 x 號節(jié)點是 u 號節(jié)點和 v 號節(jié)點的所有公共祖先中深度最深的,則稱 x 號節(jié)點是 u 號節(jié)點和 v 號節(jié)點的最近公共祖先。

輸入格式
第一行一個整數(shù) n 表示節(jié)點數(shù)。

接下來 n 行,每行兩個整數(shù),第一個整數(shù)表示 i 號節(jié)點的左兒子的編號,第二個整數(shù)表示 i 號節(jié)點的右兒子的編號,如果某個數(shù)字為 0 表示沒有對應(yīng)的子節(jié)點。

輸入保證是一棵二叉樹。

最后一行兩個整數(shù) u,v 表示要求最近公共祖先的兩個節(jié)點的編號。

輸出格式
輸出一行一個整數(shù),代表 u 號節(jié)點和 v 號節(jié)點的最近公共祖先。

樣例輸入
4
0 2
3 4
0 0
0 0
3 4
樣例輸出
2
數(shù)據(jù)規(guī)模
對于所有數(shù)據(jù),保證 2≤n≤1000,1≤u,v≤n。

代碼

highlighter- cpp

# include<bits/stdc++.h>

using namespace std;

int p[1111];
bool st[1111];

int main()
{
	int n;cin>>n;
	p[1] = 1;
	for(int i=1;i<=n;i++)
	{
		int x,y;cin>>x>>y;
		p[x] = i;p[y] = i;
	}	
	int u,v;cin>>u>>v;
	while(u!=1)
	{
		st[u] = true;u = p[u];   //記錄一個點的所有祖先
	}
	st[1] = true;
	while(!st[v]) v = p[v];  //遍歷另一個點的所有祖先,第一個和u祖先重合的就是最近公共祖先
	cout<<v<<endl;
	return 0;
}

例題4 二叉樹子樹和

http://oj.daimayuan.top/course/7/problem/459

題目

給你一棵 n 個節(jié)點的二叉樹,節(jié)點的編號為 1 到 n,二叉樹的根為 1 號節(jié)點。每個節(jié)點都有一個權(quán)值,i 號節(jié)點的權(quán)值為 ai,請求出每個節(jié)點的子樹的權(quán)值和(子樹內(nèi)節(jié)點的權(quán)值的和)。

輸入格式
第一行一個整數(shù) n 表示節(jié)點數(shù)。

接下來 n 行,每行兩個整數(shù),第一個整數(shù)表示 i 號節(jié)點的左兒子的編號,第二個整數(shù)表示 i 號節(jié)點的右兒子的編號,如果某個數(shù)字為 0 表示沒有對應(yīng)的子節(jié)點。

輸入保證是一棵二叉樹。

接下來一行 n 個整數(shù),第 i 個整數(shù) ai 表示 i 號節(jié)點的權(quán)值。

輸出格式
輸出一行 n 個整數(shù),第 i 個整數(shù)表示 i 號節(jié)點的子樹的權(quán)值和。

樣例輸入
4
2 3
0 0
4 0
0 0
1 1 1 1
樣例輸出
4 1 2 1
數(shù)據(jù)規(guī)模
對于所有數(shù)據(jù),保證 1≤n≤1000000,1≤ai≤100。

這其實是一道記憶化搜索,涉及到了二叉樹

代碼

highlighter- cpp

# include<bits/stdc++.h>

using namespace std;
typedef pair<int,int> pii;

const int N = 1e6+10;

pii a[N];
int ans[N];

int solve(int x)
{
    int t = ans[x];
    if(a[x].first) t+=solve(a[x].first);
    if(a[x].second) t+=solve(a[x].second);
    ans[x] = t;
    return t;
}


int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x,y;cin>>x>>y;
        a[i] = {x,y};
    }
    for(int i=1;i<=n;i++) {int x;cin>>x;ans[i] = x;}
    solve(1);
    for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
    return 0;
}

到此這篇關(guān)于二叉樹入門和刷題詳解的文章就介紹到這了,更多相關(guān)二叉樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 最新VScode C/C++ 環(huán)境配置的詳細教程

    最新VScode C/C++ 環(huán)境配置的詳細教程

    這篇文章主要介紹了最新VScode C/C++ 環(huán)境配置的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • oaptt搭建http服務(wù)的過程詳解

    oaptt搭建http服務(wù)的過程詳解

    這篇文章主要介紹了oaptt搭建http服務(wù),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Qt+OpenCV實現(xiàn)目標(biāo)檢測詳解

    Qt+OpenCV實現(xiàn)目標(biāo)檢測詳解

    這篇文章主要介紹了如何利用Qt和OpenCV中自帶xml文件實現(xiàn)目標(biāo)檢測,文中的實現(xiàn)過程講解詳細,感興趣的小伙伴可以動手試一試
    2022-03-03
  • C++11新特性之隨機數(shù)庫(Random?Number?Library)詳解

    C++11新特性之隨機數(shù)庫(Random?Number?Library)詳解

    相對于C++11之前的隨機數(shù)生成器來說,C++11的隨機數(shù)生成器是復(fù)雜了很多,下面這篇文章主要給大家介紹了關(guān)于C++11新特性之隨機數(shù)庫(Random?Number?Library)的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 關(guān)于背包問題的一些理解和應(yīng)用

    關(guān)于背包問題的一些理解和應(yīng)用

    這篇文章主要介紹了關(guān)于背包問題的一些理解和應(yīng)用,本文可以說是背包問題九講的補充、讀后感,需要的朋友可以參考下
    2014-08-08
  • C語言實現(xiàn)掃雷游戲的方法

    C語言實現(xiàn)掃雷游戲的方法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷游戲的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 深入理解 C++ 的 std::initializer_list及使用場景分析

    深入理解 C++ 的 std::initializer_list及使用場景分析

    本文介紹了C++11引入的std::initializer_list模板類,它作為統(tǒng)一初始化語法的重要橋梁,封裝同類型常量值,常用于容器初始化、函數(shù)參數(shù)傳遞和自定義類支持花括號初始化,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析

    C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析

    ?std::ifstream::readsome和std::ifstream::read?的主要區(qū)別在于它們處理輸入流的方式和可能返回的結(jié)果,下面給大家介紹C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • MFC設(shè)置對話框焦點的方法簡述

    MFC設(shè)置對話框焦點的方法簡述

    這篇文章主要介紹了MFC設(shè)置對話框焦點的方法簡述,主要講述了兩種實現(xiàn)方法,需要的朋友可以參考下
    2014-10-10
  • C++中的new/delete、構(gòu)造/析構(gòu)函數(shù)、dynamic_cast分析

    C++中的new/delete、構(gòu)造/析構(gòu)函數(shù)、dynamic_cast分析

    這篇文章主要介紹了C++中的new/delete、構(gòu)造/析構(gòu)函數(shù)、dynamic_cast分析 本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論

沾益县| 西城区| 宣威市| 盐边县| 澜沧| 榆中县| 册亨县| 平乐县| 承德市| 蓬莱市| 凤台县| 即墨市| 文成县| 庄浪县| 东方市| 兴海县| 天柱县| 楚雄市| 岱山县| 扎鲁特旗| 阳新县| 南丰县| 红原县| 麻城市| 图木舒克市| 健康| 香港| 奉新县| 芦山县| 德惠市| 新津县| 南康市| 从江县| 舒兰市| 甘南县| 鲁山县| 上饶市| 宁武县| 霍州市| 特克斯县| 洱源县|