NewDS
This commit is contained in:
72
模板/树/前中建树BFS.cpp
Normal file
72
模板/树/前中建树BFS.cpp
Normal file
@@ -0,0 +1,72 @@
|
||||
class Solution {
|
||||
public:
|
||||
/**
|
||||
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
|
||||
*
|
||||
* 求二叉树的右视图
|
||||
* @param preOrder int整型vector 先序遍历
|
||||
* @param inOrder int整型vector 中序遍历
|
||||
* @return int整型vector
|
||||
*/
|
||||
TreeNode* build(
|
||||
const vector<int>& pre, int preL, int preR,
|
||||
const vector<int>& in, int inL, int inR)
|
||||
{
|
||||
if (preL > preR || inL > inR) return nullptr;
|
||||
|
||||
TreeNode* root = new TreeNode(pre[preL]);
|
||||
|
||||
int Search = find(in.begin() + inL, in.begin() + inR + 1, pre[preL]) - in.begin();
|
||||
int k = Search - inL; // 左子树节点数
|
||||
|
||||
root->left = build(
|
||||
pre,
|
||||
preL + 1,
|
||||
preL + k,
|
||||
in,
|
||||
inL,
|
||||
Search - 1
|
||||
);
|
||||
|
||||
root->right = build(
|
||||
pre,
|
||||
preL + k + 1,
|
||||
preR,
|
||||
in,
|
||||
Search + 1,
|
||||
inR
|
||||
);
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
vector<int> solve(vector<int>& preOrder, vector<int>& inOrder) {
|
||||
TreeNode* root = build(
|
||||
preOrder, 0, preOrder.size() - 1,
|
||||
inOrder, 0, inOrder.size() - 1
|
||||
);
|
||||
|
||||
vector<int> result;
|
||||
if (!root) return result;
|
||||
|
||||
queue<TreeNode*> q;
|
||||
q.push(root);
|
||||
|
||||
while (!q.empty()) {
|
||||
int sz = q.size(); // 当前层节点数
|
||||
for (int i = 0; i < sz; i++) {
|
||||
TreeNode* t = q.front(); q.pop();
|
||||
|
||||
// 当前层最后一个节点
|
||||
if (i == sz - 1) {
|
||||
result.push_back(t->val);
|
||||
}
|
||||
|
||||
if (t->left) q.push(t->left);
|
||||
if (t->right) q.push(t->right);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
};
|
||||
Reference in New Issue
Block a user