//这一行删不了,好气啊,这个编辑器太水了。。。
大家先来看看二叉树的遍历顺序
如果还没理解,这里有一篇不错的博客:看懂二叉树的三种遍历
我们来简单谈谈二叉树:其实二叉树可以用结构体指针来实现,也可以用结构体数组来实现(父节点为tree[k],左儿子为tree[2*k+1], 右儿子为tree[2*k+2])
结构体指针实现二叉树
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<math.h> #include<stdlib.h> #include<queue> #include<map> #include<set> #define sa(a) scanf("%d", &a); #define bug printf("--------"); using namespace std; typedef long long LL; const int INF = 1e9; const int mod = 1e9+7; int x; struct node { int data; node *l; //指向左儿子 node *r; //指向右儿子 node() { l = NULL; r = NULL; } }; //先序法建树(dfs) void pre_build(node* &T) { T = new node; cin>>x; if(x != -1) { //我们假设输入-1为结束分支 T->data = x; pre_build(T->l); pre_build(T->r); }else T = NULL; } //兄弟(层序)法建树(bfs) void bre_build(node* &T) { queue<node*> q; T = new node; cin>>x; if(x != -1) { T->data = x; q.push(T); } while(!q.empty()) { node *p; p = q.front(); q.pop(); if(p->data != -1) { cin>>x; node *L; L = new node; if(x != -1) { L->data = x; q.push(L); }else L = NULL; p->l = L; cin>>x; node *R; R = new node; if(x != -1) { R->data = x; q.push(R); }else R = NULL; p->r = R; } } } //先序遍历(根左右) void pre_vis(node *T) { if(T) { cout<<T->data<<" "; pre_vis(T->l); pre_vis(T->r); } } //中序遍历(左根右) void mid_vis(node *T) { if(T) { mid_vis(T->l); cout<<T->data<<" "; mid_vis(T->r); } } //后序遍历(左右根) void post_vis(node *T) { if(T) { post_vis(T->l); post_vis(T->r); cout<<T->data<<" "; } } //层序遍历(每层从左往右) void cen_vis(node* &T) { queue<node*> q; q.push(T); while(!q.empty()) { node *p; p = q.front(); q.pop(); if(p) { cout<<p->data<<" "; q.push(p->l); q.push(p->r); } } } int main() { node *T1; node *T2; T1 = NULL; T2 = NULL; cout<<"先序遍历建树"<<endl; pre_build(T1); cout<<"先序遍历:"<<endl; pre_vis(T1); cout<<endl<<endl; cout<<"中序遍历:"<<endl; mid_vis(T1); cout<<endl<<endl; cout<<"后序遍历:"<<endl; post_vis(T1); cout<<endl<<endl; cout<<"层序遍历:"<<endl; cen_vis(T1); cout<<endl<<endl; cout<<"兄弟法建树(类似层序)"<<endl; bre_build(T2); cout<<"先序遍历:"<<endl; pre_vis(T2); cout<<endl<<endl; cout<<"中序遍历:"<<endl; mid_vis(T2); cout<<endl<<endl; cout<<"后序遍历:"<<endl; post_vis(T2); cout<<endl<<endl; cout<<"层序遍历:"<<endl; cen_vis(T2); cout<<endl<<endl; return 0; } /* 测试数据,大家自己输入运行试试 1 2 3 -1 -1 4 -1 -1 5 6 -1 -1 7 -1 -1 1 2 5 3 4 6 7 -1 -1 -1 -1 -1 -1 -1 -1 */
结构体数组实现二叉树
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<math.h> #include<stdlib.h> #include<queue> #include<map> #include<set> #define sa(a) scanf("%d", &a); #define bug printf("--------"); using namespace std; typedef long long LL; const int INF = 1e9; const int mod = 1e9+7; int x; struct node { int val; }tree[1010*4]; //先序法建树(dfs) void pre_build(int k) //根节点为1开始 { cin>>x; tree[k].val = x; if(x != -1) { //我们假设输入-1为结束分支 pre_build(2*k+1); pre_build(2*k+2); } } //兄弟(层序)法建树(bfs) void bre_build(int k) { queue<int> q; q.push(k); while(!q.empty()) { int cur; cur = q.front(); q.pop(); cin>>x; tree[cur].val = x; if(x != -1) { q.push(2*cur+1); q.push(2*cur+2); } } } //先序遍历(根左右) void pre_vis(int k) { if(tree[k].val != -1) { cout<<tree[k].val<<" "; pre_vis(2*k+1); pre_vis(2*k+2); } } //中序遍历(左根右) void mid_vis(int k) { if(tree[k].val != -1) { mid_vis(2*k+1); cout<<tree[k].val<<" "; mid_vis(2*k+2); } } //后序遍历(左右根) void post_vis(int k) { if(tree[k].val != -1) { post_vis(2*k+1); post_vis(2*k+2); cout<<tree[k].val<<" "; } } //层序遍历(每层从左往右) void cen_vis(int k) { queue<int> q; q.push(k); while(!q.empty()) { int cur; cur = q.front(); q.pop(); if(tree[cur].val != -1) { cout<<tree[cur].val<<" "; q.push(2*cur+1); q.push(2*cur+2); } } } int main() { cout<<"先序遍历建树"<<endl; pre_build(1); cout<<"先序遍历:"<<endl; pre_vis(1); cout<<endl<<endl; cout<<"中序遍历:"<<endl; mid_vis(1); cout<<endl<<endl; cout<<"后序遍历:"<<endl; post_vis(1); cout<<endl<<endl; cout<<"层序遍历:"<<endl; cen_vis(1); cout<<endl<<endl; cout<<"兄弟法建树(类似层序)"<<endl; bre_build(1); cout<<"先序遍历:"<<endl; pre_vis(1); cout<<endl<<endl; cout<<"中序遍历:"<<endl; mid_vis(1); cout<<endl<<endl; cout<<"后序遍历:"<<endl; post_vis(1); cout<<endl<<endl; cout<<"层序遍历:"<<endl; cen_vis(1); cout<<endl<<endl; return 0; } /* 测试数据 1 2 3 -1 -1 4 -1 -1 5 6 -1 -1 7 -1 -1 1 2 5 3 4 6 7 -1 -1 -1 -1 -1 -1 -1 -1 */