日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历

發(fā)布時(shí)間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:

給定一棵二叉樹的中序遍歷和前序遍歷,請(qǐng)你先將樹做個(gè)鏡面反轉(zhuǎn),再輸出反轉(zhuǎn)后的層序遍歷的序列。所謂鏡面反轉(zhuǎn),是指將所有非葉結(jié)點(diǎn)的左右孩子對(duì)換。這里假設(shè)鍵值都是互不相等的正整數(shù)。

輸入格式:

輸入第一行給出一個(gè)正整數(shù)N(≤30),是二叉樹中結(jié)點(diǎn)的個(gè)數(shù)。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數(shù)字間以空格分隔。

輸出格式:

在一行中輸出該樹反轉(zhuǎn)后的層序遍歷的序列。數(shù)字間以1個(gè)空格分隔,行首尾不得有多余空格。

輸入樣例:

7
1 2 3 4 5 6 7
4 1 3 2 6 5 7

輸出樣例:

4 6 1 7 5 3 2

分析:

知道二叉樹的知知中序遍歷和前序遍歷,求后序遍歷
1.鏡面反轉(zhuǎn):這個(gè)其實(shí)就只要在遞歸的時(shí)候先遞歸右樹,再遞歸左樹就好;
2.層序遍歷:

不同的層放在一個(gè)vector中,每層可以區(qū)分開,在遞歸過程中,當(dāng)做一個(gè)完全滿二叉樹來看,初始化vector數(shù)組為-1(表示二叉樹節(jié)點(diǎn)都為Null),將每個(gè)值放在對(duì)應(yīng)節(jié)點(diǎn)上,輸出時(shí),特判一下-1(即為空)的狀態(tài)即可。
3.復(fù)習(xí):創(chuàng)建vector容器的三種方式
(1)不指定元素個(gè)數(shù):

vector<int>v;

(2)指定容器的大小

vector<int>v(10);

(3)指定容器的大小,且每個(gè)元素具有指定的初始值。

vector<double>(10,8.6);

4.利用遞歸,從前序一個(gè)個(gè)元素開始,root=1; 在中序中找到a[root]==b[i]a[root]==b[i]a[root]==b[i],
然后將中序分為兩部分,b[1.....i?1]和b[i+1.....n]b[1.....i-1] 和b[i+1.....n]b[1.....i?1]b[i+1.....n],然后分別遍歷這兩
部分,直到這兩部分元素為0(x>y) 或1個(gè)(x==y);

  • 左子樹 ,左子樹范圍必定在x到i-1之間,下一個(gè)根的位置在root+1
  • 右子樹,右子樹范圍必定在i+1到y(tǒng)之間,根的位置就是(i-x)是左子樹
    的大小,相當(dāng)于root位置往后移左子樹的個(gè)數(shù)再加一

前序遍歷:根左右
中序遍歷:左根右
后序遍歷:左右根

AC代碼:

#include <iostream> #include<stdio.h> #include <vector> #define N 31 using namespace std; int a[N],b[N]; vector<int> ve(100000,-1); void build(int x,int y,int root,int step)/**x,y為左子樹或右子樹的區(qū)間,root為根節(jié)點(diǎn),step為當(dāng)前根節(jié)點(diǎn)的位置(滿二叉樹)*/ {if(x>y) return;ve[step]=a[root];/**記錄當(dāng)前根節(jié)點(diǎn)的位置*/int i;for(i=x;i<=y;++i){if(a[root]==b[i])break;}build(i+1,y,root+(i-x)+1,step*2+1);build(x,i-1,root+1,step*2+2);/**鏡面這個(gè)其實(shí)就只要在遞歸的時(shí)候先遞歸右樹,再遞歸左樹就好*/ } int main() {int n;cin>>n;for(int i=1;i<=n;++i)cin>>b[i];for(int i=1;i<=n;++i)cin>>a[i];build(1,n,1,0);int cnt=0;for(int i=0;i<ve.size()&&cnt<=n;++i){if(ve[i]!=-1){if(i)cout<<" ";cout<<ve[i];++cnt;}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。