花了几分钟把之前做的二叉树的建树模板总结了一下,都是很精炼的。

根据先序中序建树,或者根据中序后序建树。

用结构体指针建树的两种方式

不管是根据先序中序,还是中序后序几种方法都可以

用每段长度模拟
核心是根据前序或者后序的根找到中序根的位置,然后对两边分开模拟

const int maxn=1e2+5,inf=0x3f3f3f3f;
typedef long long ll;
ll g[maxn][maxn],pre[maxn];
typedef struct Node *node;
struct Node{ll val;node lf,rf;
};
ll zx[maxn],xx[maxn],f=1;
node create(ll zx[],ll xx[],ll len){if(!len) return nullptr;else{node t=new Node({xx[0],nullptr,nullptr});ll i=0;while(zx[i++]!=xx[0]);t->lf=create(zx,xx+1,i-1);t->rf=create(zx+i,xx+i,len-i);return t;}
}
node create(ll hx[],ll zx[],ll len){if(!len) return nullptr;else{node t=new Node({hx[len-1],nullptr,nullptr});ll i=0;while(zx[i++]!=hx[len-1]);t->lf=create(hx,zx,i-1);t->rf=create(hx+i-1,zx+i,len-i);return t;}
}

用每段的位置模拟
核心是根据前序或者后序的根找到中序根的位置,然后对两边分开模拟

const int maxn=1e2+5,inf=0x3f3f3f3f;
typedef long long ll;
ll g[maxn][maxn],pre[maxn];
typedef struct Node *node;
struct Node{ll val;node lf,rf;
};
ll zx[maxn],xx[maxn],f=1;
node create(ll inl,ll inr,ll firl,ll firr){if(inl>inr)return nullptr;node t=new Node({xx[firl],nullptr,nullptr});ll i=1;while(zx[i]!=xx[firl]) i++;ll len=i-inl;t->lf=create(inl,i-1,firl+1,firl+len);t->rf=create(i+1,inr,firl+len+1,firr);  return t;
}
node create(ll postl,ll postr,ll inl,ll inr){if(postl>postr) return nullptr;else{node t=new Node({hx[postr],nullptr,nullptr});ll i=0;while(zx[i]!=hx[postr]) i++;ll num=i-inl;t->lf=create(postl,postl+num-1,inl,i-1);t->rf=create(postl+num,postr-1,i+1,inr);return t;}
}

用数组模拟层序遍历

vector<int>in,pre,level(1000000,-1);
void levelorder(int root,int start,int end,int index)
{if(start>end)   return ;int i=start;while(i<end&&pre[root]!=in[i]) i++;level[index]=pre[root];levelorder(root+1,start,i-1,2*index+2);   //这个+2是根据题目中要求的,我这个题目是反序层次遍历,当然这俩顺序可以换一下。看题目中要求levelorder(root+1+i-start,i+1,end,2*index+1);
}

用数组模拟某序遍历

vector<int>in,pre,level(1000000,-1);
void levelorder(int root,int start,int end)
{if(start>end)   return ;int i=start;while(i<end&&pre[root]!=in[i]) i++;// 换成输出就可以了levelorder(root+1,start,i-1);levelorder(root+1+i-start,i+1,end);
}

用数组模拟二叉搜索树

// idx 需要从 1 开始
void build(int idx,int x)
{if(a[idx]==0)    a[idx]=x;else if(x>a[idx])  build(idx<<1|1,x);// <<1 相当于乘2, |1相当于+1else if(x<a[idx]) build(idx<<1,x);
}

平衡二叉树

#include<bits/stdc++.h>
#define rep(i,a,b) for(ll i=(a);i<=(b);++i)
#define per(i,a,b) for(ll i=(a);i>=(b);--i)
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
typedef struct Node *node;
struct Node{ll val;node lf,rf;
};
ll Gh(node t){if(!t) return 0;else{ll l,r;l=Gh(t->lf);r=Gh(t->rf);return l>r?++l:++r;}
}
node turnleft(node t){node r=t->rf;t->rf=r->lf;r->lf=t;return r;
}
node turnright(node t){node r=t->lf;t->lf=r->rf;r->rf=t;return r;
}
node turnleftright(node t){t->lf=turnleft(t->lf);return turnright(t);
}
node turnrightleft(node t){t->rf=turnright(t->rf);return turnleft(t);
}
node insert(node t,ll x){if(!t) t=new Node({x,nullptr,nullptr});else{if(x<t->val){t->lf=insert(t->lf,x);if(Gh(t->lf)-Gh(t->rf)==2){if(x<t->lf->val)t=turnright(t);elset=turnleftright(t);}}else{t->rf=insert(t->rf,x);if(Gh(t->rf)-Gh(t->lf)==2){if(t->rf->val<x)t=turnleft(t);elset=turnrightleft(t);}}}return t;
}
int main(){ll n,x;node t=nullptr;cin >> n;rep(i,0,n-1){cin >> x;t=insert(t,x);}cout << t->val;return 0;
}

根据二叉搜索树构建平衡二叉树

#include<bits/stdc++.h>
using namespace std;
static const int maxn=1e5;
typedef struct Node *node;
struct Node{int val;node lf,rf;
};
int a[maxn],cnt=0;
void dfs(node t){if(t){dfs(t->lf);a[cnt++]=t->val;dfs(t->rf);}
}
node build(int l,int r){if(l>r)return nullptr;int mid=(l+r)/2;node t=new Node({a[mid],nullptr,nullptr});t->lf=build(l,mid-1);t->rf=build(mid+1,r);return t;
}
int main() {node root;//构建root,root为普通的二叉搜索树 dfs(root);node t=build(0,cnt-1); // cnt为r的节点个数,cnt-1为最后一个的下标//t为平衡二叉树 return 0;
}

二叉树构建的各种方法相关推荐

  1. 前沿技术探秘:知识图谱构建流程及方法

    作者 | 郑毅 封图| CSDN│下载于视觉中国 出品 | CSDN云计算(ID:CSDNcloud) 随着AI技术的发展和普及,当今社会已经进入了智能化时代.与以往不同的是,在这一波浪潮中,企业不仅 ...

  2. 链表问题15——将搜索二叉树转换成双向链表(方法二)

    题目 题目同上一篇文章,即题目将二叉树按照中序顺序转换成双向链表 思路 方法二:利用递归函数,不使用任何容器.时间复杂度为O(N),额外空间复杂度为O(h),h为二d d d df叉树的高度 首先需要 ...

  3. php 二叉树判断节点的位置,PHP实现判断二叉树是否对称的方法

    本文实例讲述了PHP实现判断二叉树是否对称的方法.分享给大家供大家参考,具体如下: 问题 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. ...

  4. 二叉树构建及双向链表

    二叉树构建及双向链表 文章目录 二叉树构建及双向链表 一.从前序与中序遍历序列构造二叉树 代码 二.从中序与后序遍历序列构造二叉树 代码 三.二叉搜索树转双向链表 代码 一.从前序与中序遍历序列构造二 ...

  5. tensorflow2 神经网络模型构建4种方法

    这里写目录标题 学习目标: 学习内容: 1. 使用现有的预训练模型 线下训练,线上加载运行 线下训练 线上加载 迁移学习 2.Keras Sequential模式建立模型(不推荐,灵活性太差) 3.F ...

  6. QT中三种构建菜单栏的方法

    QT中三种构建菜单栏的方法 方法1 <C++ GUI programming with Qt 4, Second Edition>给出的一种方法:QMenum定义单个菜单,调用menuBa ...

  7. DS二叉树—二叉树构建与遍历(不含框架)

    题解: 这里面myTree中的root成员是在main函数中声明,但在CreateTree中malloc,所以注意CreateTree函数要传引用. 题目: 问题 A: DS二叉树-二叉树构建与遍历( ...

  8. 问题 A: DS二叉树—二叉树构建与遍历

    第一次写博客,不足之处请大家包涵指出!谢谢! 问题 A: DS二叉树-二叉树构建与遍历(不含框架) 题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符'#'表示,例如AB#C##D ...

  9. 知识图谱构建的实验方法

    知识图谱构建的实验方法包括以下几种: 人工构建: 通过专家知识或文献研究手动构建知识图谱. 爬虫爬取: 使用爬虫技术爬取网络上的知识信息. 半自动构建: 通过机器学习或自然语言处理技术对爬取的知识信息 ...

最新文章

  1. 8086 汇编指令手册查询(转)
  2. UVA11100旅行(大包装小包,问最少多少个包)
  3. 温州大学瓯江学院 计算机院赛,温州大学
  4. w8计算机配置要求,win8系统最低配置要求有哪些|win8系统是否有最低配置要求-系统城...
  5. 2018-2019 20165226 Exp9 Web安全基础
  6. java基础代码下载_Java基础(一)(示例代码)
  7. Oracle Net Services 配置:Xlib: connection to :0.0 refused by server
  8. 小米Android系统限制联网,Android 7 以上版本,绕过CA限制,抓取https
  9. 网易云基于 Kubernetes 的深度定制化实践
  10. 【linux】nmap命令使用
  11. TCP和Udp的区别是什么?
  12. pscc2019滤镜抽出_Adobe Photoshop CC 2019滤镜工具提升图片清晰度(PS)教程
  13. wordcloud库详解
  14. Java实验9 矩形类的定义与封装
  15. 响应式Web设计帮助移动终端访问网站
  16. 通过命令符查看笔记本电脑的电池损耗
  17. 使用AUI框架开发微信小程序
  18. 计算机丢失系统文件如何找回,如何恢复电脑上丢失的文件
  19. java饼图_java 百分比饼图的实现代码
  20. java编程细节总结(一):等于号的作用

热门文章

  1. Gitlab 12.9.4 的搭建部署及遇到的问题。
  2. android开发笔记之属性动画
  3. Nexperia |超低电容 ESD 保护二极管保护汽车数据接口基础半导体器件
  4. Git连接远程仓库(私有/公开仓库),克隆代码
  5. 民谣与2017年终总结
  6. html中怎么制作太阳月亮交替,CSS3 简单的地球/太阳/月亮动画
  7. 区块链技术十周年—回眸与前瞻
  8. 如何编写测试用例?(详细分析)
  9. 再度公开少林内修心法 易筋经和洗髓经 欢迎转载 让全人类共享学习 过得更健康
  10. ATALINA_HOME environment variable is not defined correctly问题的解决(Tomcat)