1、最大公共子串
和前面求最大公共子串一样,只不过三个的话可以用三维 dp 来解决,这里就不写了
2、中序和后序输出层次遍历
#include <iostream>
#include<queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left, * right;
TreeNode(int v) : val(v), left(NULL), right(NULL) {}
};
TreeNode* createTree(string inOrder, string postOrder, int left1, int right1, int left2, int right2) {
if(left1 > right1 || left2 > right2)
return NULL;
TreeNode* root = new TreeNode(postOrder[right2] - '0');
int pos = 0; // 根节点位置
for (int i = left1; i <= right1; i++) {
if (inOrder[i] == postOrder[right2]) {
pos = i; break;
}
}
int len = pos - left1;
root->left = createTree(inOrder, postOrder, left1, pos - 1, left2, left2 + len - 1);
root->right = createTree(inOrder, postOrder, pos + 1, right1, left2 + len, right2 - 1);
return root;
}
void levelTraverse(TreeNode* root) {
if (root == NULL) return;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
for (int i = q.size() - 1; i >= 0; i--) {
auto top = q.front();
q.pop();
cout << top->val << " ";
if (top->left) q.push(top->left);
if (top->right) q.push(top->right);
}
cout << endl;
}
}
int main() {
string inOrder, postOrder;
cin >> inOrder >> postOrder;
TreeNode* root = createTree(inOrder, postOrder, 0, inOrder.size() - 1, 0, postOrder.size() - 1);
levelTraverse(root);
return 0;
} 
京公网安备 11010502036488号