一、二叉树的基本操作
1、二叉树存储结构
2、二叉树结点的查找、修改
3、二叉树结点的插入
4、二叉树的创建
二、二叉树的遍历
1、先序遍历
2、中序遍历
3、后序遍历
4、层次遍历
5、问题:知先中输后层
Sample Input
9 1 2 4 7 3 5 8 9 6 4 7 2 1 8 5 9 3 6
Sample Output
1 2 3 4 5 6 7 8 9
7 4 2 8 9 5 6 3 1
代码:
#include<iostream> #include<algorithm> #include<queue> #include<cstdio> #include<cstdlib> using namespace std; struct node{ int data; node*lchild; node*rchild; }; node* creat(int preL,int preR,int inL,int inR); void layerOrder(node *root); void PostOrder(node *root); int pre[50],in[50],post[50]; int n; int main(){ while(cin>>n){ for(int i=0;i<n;i++){ cin>>pre[i]; } for(int i=0;i<n;i++){ cin>>in[i]; } node* root = creat(0,n-1,0,n-1); layerOrder(root);//层次遍历 cout<<endl; PostOrder(root);//后序遍历 cout<<endl; } return 0; } node* creat(int preL,int preR,int inL,int inR){//建树 if(preL>preR){ return NULL; } node *root = (node*)malloc(sizeof(node)); root->data = pre[preL]; int k; for(k=inL;k<=inR;k++){ if(pre[preL]==in[k]){ break; } } int numLeft = k-inL; root->lchild=creat(preL+1,preL+numLeft,inL,k-1); root->rchild=creat(preL+numLeft+1,preR,k+1,inR); return root; } void layerOrder(node *root){ queue<node*> p; p.push(root); while(!p.empty()){ node* now = p.front(); p.pop(); printf("%d ",now->data); if(now->lchild != NULL){ p.push(now->lchild); } if(now->rchild != NULL){ p.push(now->rchild); } } } void PostOrder(node *root){ if(root==NULL){ return; } PostOrder(root->lchild); PostOrder(root->rchild); printf("%d ",root->data); }
三、二叉树的静态实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结