5-11 玩轉二叉樹 (25分)
給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。
輸入格式:
輸入第一行給出乙個正整數n(\le≤30),是二叉樹中結點的個數。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數字間以空格分隔。
輸出格式:
在一行中輸出該樹反轉後的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。
輸入樣例:
7 1 2 3 4 5 6 7
4 1 3 2 6 5 7
輸出樣例:
4 6 1 7 5 3 2
根據先序與中序遍歷求出二叉樹,然後用bfs遍歷求按層遍歷的結果
#include
#include
#include
#include
#include
using
namespace
std;
#define m 10010
int mid[m], fir[m];
struct node
;node a[m];
int build(int la, int ra, int lb, int rb)//建立二叉樹
int p1, p2, rt;
p1 = la;
rt = fir[lb];//先序遍歷的第乙個點事根
while(mid[p1] != rt)
p2 = p1 - la;//記錄乙個子樹的範圍
a[rt].l = build(la, p1-1, lb+1, lb+p2);//左子樹
a[rt].r = build(p1+1, ra, lb+p2+1, rb);//右子樹
return rt;//返回根節點
}void bfs(int rt)
vec.push_back(x);
if(a[x].r != 0)//交叉變換所以先遍歷右子樹
if(a[x].l != 0)
}int len = vec.size();
for(int i=0; iprintf("%d%c", vec[i], i==len-1 ? '\n' : ' ');
}}int main()
for(int i=0; iscanf("%d", &fir[i]);
}int root = fir[0];
build(0, n-1, 0, n-1);
bfs(root);
return
0;}
CCCC練習 5 11玩轉二叉樹
給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入第一行給出乙個正整數n le 30 是二叉樹中結點的個數。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數字間以空格分...
5 11 玩轉二叉樹 25分
給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入第一行給出乙個正整數n le 30 是二叉樹中結點的個數。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數字間以空格分...
資料結構 二叉樹 反轉二叉樹
include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...