二叉树的建树
1. 已知前序与中序来建树
acwing版本:
字符串形式
#include <iostream>
#include <string>
using namespace std;
string pre, in;
void dfs(string pre,string in)
{
if(pre.empty()) return ;
char a = pre[0];
int k = in.find(a);
dfs(pre.substr(1,k), in.substr(0,k));
dfs(pre.substr(k + 1), in.substr(k + 1));
cout << a;
}
int main()
{
while(cin >> pre >> in)
{
dfs(pre,in);
puts("");
}
return 0;
}
leetcode版本:
数组储存版本
class Solution {
public:
unordered_map<int,int> map_;
TreeNode* dfs(vector<int>& pre, vector<int>& in,int a,int b,int c,int d)
{
if(a>b) return NULL;
int ro = pre[a];
int k = map_[ro];
TreeNode* root = new TreeNode(ro);
root -> left = dfs(pre, in, a + 1, a + k - c, c, k - 1);
root -> right = dfs(pre, in, a + k - c + 1, b, k + 1, d);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
int n = inorder.size();
for(int i = 0 ; i < n ; i ++) map_[inorder[i]] = i;
return dfs(preorder,inorder,0,n - 1,0,n - 1);
}
};
注意:出口条件当pre或者in内无元素返回空指针
2. 按照带标记序号的x序进行建树
😂首先可以学习一下leetcode建树节点的步骤
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode():val(0),left(nullptr),right(nullptr){}
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
TreeNode(int x,TreeNode *l,TreeNode* r):val(x),left(l),right(r){}
}
首先说明:
- 先序与后序是有可能建树的,但是中序不太可能
- 后序只要从最后一个字母/数字开始建树,就和前序几乎一样,不过这里是\(\color{Red}{根->右->左}\)
这方面的模板大同小异,这或许算是简洁的一种。
TreeNode* build()
{
char val;
cin >> val;
TreeNode *n;
if(val != '#')
{
n = new TreeNode(val);
n -> left = build();
n -> right = build();
}
else n = nullptr;
return n;
}

$\color{#4c5870}{\underline{建树永远是最简单的}}$
浙公网安备 33010602011771号