【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)
OJ編程實例
給定一棵二叉樹的前序(根、左、右)和中序(左、根、右)的打印結果,輸出此二叉樹按層(從左往右)打印結果。
例如一棵二叉樹前序:1 2 4 5 3;中序:4 2 5 1 3。可以構建出下圖所示二叉樹:

按層打印的結果則為:1 2 3 4 5。
按層打印二叉樹(去哪兒網2017春招真題)
題目描述
using
namespace
std
;
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
struct
TreeNode
{
int
val
;
TreeNode
*
left
;
TreeNode
*
right
;
TreeNode
(
int
x
)
:
val
(
x
),
left
(
NULL
),
right
(
NULL
)
{}
//
參數初始化列表
};
using
iter
=
vector
<
int
>::
iterator
;
TreeNode
*
createTree
(
iter prebegin
,
iter preend
,
iter inbegin
,
iter inend
);
void
levelOrder
(
TreeNode
*
root
);
int
main
()
{
/* if (freopen("./src/input.txt", "r", stdin))//
代替手工輸入
,
需加
<cstdio>
頭文件
,vs
默認路徑起點為工程文件所在的目錄
cout << "
讀取成功
" << endl;
else
cout << "
讀取文件失敗
" << endl;*/
int
n
;
cin
>>
n
;
vector
<
int
>
preorder
(
n
);
vector
<
int
>
inorder
(
n
);
for
(
int
i
=
0
;
i
<
n
;
i
++)
{
cin
>>
preorder
[
i
];
}
for
(
int
i
=
0
;
i
<
n
;
i
++)
{
cin
>>
inorder
[
i
];
}
TreeNode
*
root
=
createTree
(
preorder
.
begin
(),
preorder
.
end
(),
inorder
.
begin
(),
inorder
.
end
());
levelOrder
(
root
);
return
0
;
}
TreeNode
*
createTree
(
iter prebegin
,
iter preend
,
iter inbegin
,
iter inend
)
{
if
(
prebegin
>=
preend
||
inbegin
>=
inend
)
return
nullptr
;
TreeNode
*
root
=
new
TreeNode
(*
prebegin
);
iter root_pos
=
find
(
inbegin
,
inend
,
root
->
val
);
int
left_length
=
root_pos
-
inbegin
;
root
->
left
=
createTree
(
prebegin
+
1
,
prebegin
+
left_length
+
1
,
inbegin
,
root_pos
);
root
->
right
=
createTree
(
prebegin
+
left_length
+
1
,
preend
,
root_pos
+
1
,
inend
);
return
root
;
}
void
levelOrder
(
TreeNode
*
root
)
{
if
(
root
==
nullptr
)
return
;
queue
<
TreeNode
*>
q
;
q
.
push
(
root
);
while
(!
q
.
empty
())
{
int
size
=
q
.
size
();
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
TreeNode
*
node
=
q
.
front
();
cout
<<
node
->
val
<<
' '
;
q
.
pop
();
if
(
node
->
left
)
q
.
push
(
node
->
left
);
if
(
node
->
right
)
q
.
push
(
node
->
right
);
}
}
}