二叉树的7种遍历(必背)
代码:
1~3:递归先序、中序、后序:
这三种没什么难度,放在这凑个数
void preOrder(Node* p){
if(p){
visit(p);
preOrder(p->l);
preOrder(p->r);
}
}
void inOrder(Node* p){
if(p){
inOrder(p->l);
visit(p);
inOrder(p->r);
}
}
void postOrder(Node* p){
if(p){
postOrder(p->l);
postOrder(p->r);
visit(p);
}
}
非递归栈实现:
4.非递归先序:
void preOrderNonRecursion(Node* root){
Node *stack[MaxSize];
int top=-1;
stack[++top]=root;
while(top>=0){ //若栈非空,一直循环
Node *nd=stack[top--];
visit(nd);
if(nd->r) //注意先右后左
stack[++top]=nd->r;
if(nd->l)
stack[++top]=nd->l;
}
}
5.非递归中序:
void inOrderNonRecursion(Node* p){
Node *stack[MaxSize];
int top=-1;
while(p || top>=0){ //只有当p节点为空,栈也为空的时候,退出循环
while(p) {
stack[++top]=p;
p=p->l;
}
if(top>=0){
p=stack[top--];
visit(p);
p=p->r;
}
}
}
6.非递归后序:(硬编码非抽象实现的两个栈真的很麻瓜啊……)
void postOrderNonRecursion(Node* p){
Node *stack1[MaxSize];
Node *stack2[MaxSize];
int top1=-1;
int top2=-1;
stack1[++top1]=p;
while(top1>=0){ //若栈非空,一直循环
p=stack1[top1--];
stack2[++top2] =p;
if(p->l) //注意先左后右
stack1[++top1]=p->l;
if(p->r)
stack1[++top1]=p->r;
}
while(top2>=0){
p=stack2[top2--];
visit(p);
}
}
7.层序遍历:
void levelOrder(Node* root){
Node* queue[MaxSize];
int front=0,rear=0;
rear=(rear+1)%MaxSize;
queue[rear]=root;
while(front!=rear){ //保证非空
front=(front+1)%MaxSize;
Node* nd=queue[front];
visit(nd);
if(nd->l){
rear=(rear+1)%MaxSize;
queue[rear]=nd->l;
}
if(nd->r){
rear=(rear+1)%MaxSize;
queue[rear]=nd->r;
}
}
}
完整代码:
#include<iostream>
#define ElemType char
#define MaxSize 100
using namespace std;
typedef struct Node{
struct Node* l=NULL;
struct Node* r=NULL;
ElemType data;
Node(ElemType data=0):data(data){
}
}Node;
Node* buildSampleTree(){//样例树形结构来自天勤 2019 版 142 页
Node* nd=new Node('A');
nd->l= new Node('B');
nd->r= new Node('G');
nd->l->l= new Node('C');
nd->l->r= new Node('D');
nd->r->l= new Node('H');
nd->l->r->l= new Node('E');
nd->l->r->r= new Node('F');
return nd;
}
void visit(Node* p){
cout<<p->data<<' ';
}
void preOrder(Node* p){
if(p){
visit(p);
preOrder(p->l);
preOrder(p->r);
}
}
void inOrder(Node* p){
if(p){
inOrder(p->l);
visit(p);
inOrder(p->r);
}
}
void postOrder(Node* p){
if(p){
postOrder(p->l);
postOrder(p->r);
visit(p);
}
}
void preOrderNonRecursion(Node* root){
Node *stack[MaxSize];
int top=-1;
stack[++top]=root;
while(top>=0){ //若栈非空,一直循环
Node *nd=stack[top--];
visit(nd);
if(nd->r) //注意先右后左
stack[++top]=nd->r;
if(nd->l)
stack[++top]=nd->l;
}
}
void inOrderNonRecursion(Node* p){
Node *stack[MaxSize];
int top=-1;
while(p || top>=0){ //只有当p节点为空,栈也为空的时候,退出循环
while(p) {
stack[++top]=p;
p=p->l;
}
if(top>=0){
p=stack[top--];
visit(p);
p=p->r;
}
}
}
void postOrderNonRecursion(Node* p){
Node *stack1[MaxSize];
Node *stack2[MaxSize];
int top1=-1;
int top2=-1;
stack1[++top1]=p;
while(top1>=0){ //若栈非空,一直循环
p=stack1[top1--];
stack2[++top2] =p;
if(p->l) //注意先左后右
stack1[++top1]=p->l;
if(p->r)
stack1[++top1]=p->r;
}
while(top2>=0){
p=stack2[top2--];
visit(p);
}
}
void levelOrder(Node* root){
Node* queue[MaxSize];
int front=0,rear=0;
rear=(rear+1)%MaxSize;
queue[rear]=root;
while(front!=rear){ //保证非空
front=(front+1)%MaxSize;
Node* nd=queue[front];
visit(nd);
if(nd->l){
rear=(rear+1)%MaxSize;
queue[rear]=nd->l;
}
if(nd->r){
rear=(rear+1)%MaxSize;
queue[rear]=nd->r;
}
}
}
int main(){
Node *root=buildSampleTree();
//recursion
preOrder(root);
puts("");
inOrder(root);
puts("");
postOrder(root);
puts("");
//implement by stack
preOrderNonRecursion(root);
puts("");
inOrderNonRecursion(root);
puts("");
postOrderNonRecursion(root);
puts("");
levelOrder(root);
}


浙公网安备 33010602011771号