最常用代码:
一:造树
依据前序,中序,造树:
const int N=2e5+5;
int n;
int pre[N];
int ind[N];
struct node{
int val;
node *l,*r;
};
node *mktree(int h1,int h2,int len){
if(len==0) return nullptr;
node *rt=new node;//要初始化 将l,r默认为null
int t =pre[h1];
rt->val=t;
int i;
for(i=h2;i<h2+len;i++) if(ind[i]==t) break;
int l1=i-h2;
int l2=len-1-l1;
rt->l=mktree(h1+1,h2,l1);
rt->r=mktree(h1+l1+1,i+1,l2);
return rt;
}
cin>>n;
fori(i,1,n) cin>>pre[i];
fori(i,1,n) cin>>ind[i];
node *rt = mktree(1,1,n);
依据后序,中序,造树:
const int N=2e5+5;
int n;
int pos[N];
int ind[N];
vector<int> ans;
struct node{
int val;
node *l;
node *r;
};
node *mktree(int h1,int h2,int len){
if(len==0) return nullptr;
node *rt =new node;
int t=pos[h2+len-1];
rt->val=t;
int i;
for(i=h1;i<h1+len;i++) if(ind[i]==t) break;
int l1=i-h1;
int l2=len-1-l1;
rt->l=mktree(h1,h2,l1);
rt->r=mktree(i+1,h2+l1,l2);
return rt;
}
cin>>n;
fori(i,1,n) cin>>ind[i];
fori(i,1,n) cin>>pos[i];
node *rt = mktree(1,1,n);
依据前序,后序,猜测树:
const int N=2e2+5;
int n;
int pre[N];
int pos[N];
struct node{
int val;
node *l=NULL;
node *r=NULL;
};
node *mktree(int h1,int h2,int len){
if(len==0) return NULL;
node *rt= new node;
rt->val = pre[h1];
if(len==1) return rt;
int t=pre[h1+1];
int i;
for(i=h2;i<len+h2;i++) if(pos[i]==t) break;
int l1=i-h2+1;
int l2=len-1-l1;
if(l2==0) can=false;
rt->l= mktree(h1+1,h2,l1);
rt->r=mktree(h1+1+l1,i+1,l2);
return rt;
}
cin>>n;
for(int i=1;i<=n;i++) cin>>pre[i];
for(int i=1;i<=n;i++) cin>>pos[i];
node *rt=mktree(1,1,n);
依据前序,二叉搜索树,构造树:
const int N=2e5+5;
int m,n;
int pre[N];
struct node{
int val;
node *l,*r;
};
unordered_map<int,node*> mp;
node *mktree(int h,int t){
if(h>t) return nullptr;
node *rt = new node;
int t1=pre[h];
rt->val=t1;
int i;
for(i=h+1;i<=t;i++) if(pre[i]>=t1) break;
rt->l=mktree(h+1,i-1);
rt->r=mktree(i,t);
return rt;
}
cin.tie(0);
ios::sync_with_stdio(false);
cin>>m>>n;
fori(i,1,n) cin>>pre[i];
node *rt=mktree(1,n);
二:遍历方式
vector v//存数据:
树用结构体+指针构造好了后,就可以任意遍历了
前序遍历:
void preorder(node *rt){
if(rt){
v.push_back(rt->val);
preorder(rt->l);
preorder(rt->r);
}
}
中序遍历:
void inorder(node *rt){
if(rt){
preorder(rt->l);
v.push_back(rt->val);
preorder(rt->r);
}
}
后序遍历
void postorder(node *rt){
if(rt){
postorder(rt->l);
postorder(rt->r);
v.push_back(rt->val);
}
}
层次遍历
void levelorder(node *rt){
queue<node*> q;
q.push(rt);
while(q.size()){
auto t=q.front();q.pop();
v.push_back(t->val);
if(t->l) q.push(t->l);
if(t->r) q.push(t->r);
}
}
树,有二叉树,非二叉树。
将数组建成二叉树。
更详细的:https://blog.csdn.net/qq_21989927/article/details/108197861
数组从0开始,
找子节点,为2i+1,2i+2;
找父节点,为(i-1)/2
依据层次遍历,二叉搜索树,构造树:
#include<bits/stdc++.h>
using namespace std;
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 *left, TreeNode *right) : val(x), left(left), right(right) {
}
};
vector<int> arr;
void creTree(TreeNode* &rt,int idx) {
if(idx>arr.size()-1) return;
rt = new TreeNode(arr[idx],nullptr,nullptr);
if(idx*2+1<=arr.size()-1) creTree(rt->left,idx*2+1);
if(idx*2+2