非遞迴實現先序遍歷和中序遍歷
先序建立二叉樹、非遞迴實現先序遍歷和中序遍歷、佇列實現層次遍歷
先序建立二叉樹,#表示空結點。
使用棧,實現非遞迴先序遍歷和中序遍歷。
使用佇列實現層次遍歷。
直接上程式碼,寒假完善註釋,甚至從頭到尾把《資料結構與演算法》的相關程式碼寫一遍。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;
typedef char DataType;
#define MAXSIZE 100
typedef struct node
{
DataType data;
struct node *lchild;
struct node *rchild;
}BiTreeNode,*BiTree;
//先序建立二叉樹
void CreateBiTree(BiTree &root)
{
char c;
cin>>c;
if(c=='#')
{
root=NULL;
}
else
{
root=(BiTree)malloc(sizeof(BiTreeNode));
root->data=c;
CreateBiTree(root->lchild);
CreateBiTree(root->rchild);
}
}
//遞迴實現先序遍歷
void PreOrder(BiTree root)
{
if(root!=NULL)
{
cout<<root->data<<" ";
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
//遞迴實現中序遍歷
void InOrder(BiTree root)
{
if(root!=NULL)
{
InOrder(root->lchild);
cout<<root->data<<" ";
InOrder(root->rchild);
}
}
//遞迴實現後序遍歷
void PostOrder(BiTree root)
{
if(root!=NULL)
{
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data<<" ";
}
}
//非遞迴實現先序遍歷
void NonPreOrder(BiTree root)
{
BiTree S[MAXSIZE];
BiTree p;
int top=-1;
S[++top]=root;
while(top!=-1)
{
p=S[top--];
cout<<p->data<<" ";
if(p->rchild!=NULL) S[++top]=p->rchild;
if(p->lchild!=NULL) S[++top]=p->lchild;
}
}
//非遞迴實現中序遍歷
void NonInOrder(BiTree root)
{
BiTree S[MAXSIZE];
BiTree p=root;
int top=-1;
while(top!=-1 || p!=NULL)
{
while(p!=NULL)
{
S[++top]=p;
p=p->lchild;
}
if(top!=-1)
{
p=S[top--];
cout<<p->data<<" ";
p=p->rchild;
}
}
}
//佇列實現層次遍歷
void LevelOrder(BiTree root)
{
BiTree Queue[MAXSIZE];
int front=-1;
int rear=0;
Queue[rear]=root;
while(rear!=front)
{
cout<<Queue[++front]->data<<" ";
if(Queue[front]->lchild) Queue[++rear]=Queue[front]->lchild;
if(Queue[front]->rchild) Queue[++rear]=Queue[front]->rchild;
}
}
//求二叉樹的深度
int Depth(BiTree root)
{
if(root==NULL) return 0;
else return max(Depth(root->lchild),Depth(root->rchild))+1;
}
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
//求葉子結點的數量
int LeafCount(BiTree root)
{
if(root==NULL) return 0;
if(root->lchild==NULL && root->rchild==NULL) return 1;
return LeafCount(root->lchild)+LeafCount(root->rchild);
}
//測試序列:ABD##E##CF###
int main()
{
BiTree root;
CreateBiTree(root);
cout<<"二叉樹的深度: "<<Depth(root)<<endl;
cout<<"二叉樹的葉子結點數: "<<LeafCount(root)<<endl;
cout<<"遞迴先序遍歷: ";
PreOrder(root);
cout<<endl;
cout<<"非遞迴先序遍歷: ";
NonPreOrder(root);
cout<<endl;
cout<<"遞迴中序遍歷: ";
InOrder(root);
cout<<endl;
cout<<"非遞迴中序遍歷: ";
NonInOrder(root);
cout<<endl;
cout<<"遞迴後序遍歷: ";
PostOrder(root);
cout<<endl;
cout<<"層次遍歷: ";
LevelOrder(root);
cout<<endl;
system("pause");
return 0;
}
相關文章
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 非遞迴遍歷二叉樹的四種策略-先序、中序、後序和層序遞迴二叉樹
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- PHP基於非遞迴演算法實現先序、中序及後序遍歷二叉樹操作示例PHP遞迴演算法二叉樹
- [java] 二叉樹的後序遍歷(遞迴與非遞迴實現)Java二叉樹遞迴
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- 二叉樹建立,前序遍歷,中序遍歷,後序遍歷 思路二叉樹
- 二叉樹的建立、前序遍歷、中序遍歷、後序遍歷二叉樹
- 刷題系列 - Python用非遞迴實現二叉樹中序遍歷Python遞迴二叉樹
- Java中用遞迴和迭代實現二叉樹的中序( InOrder )遍歷Java遞迴二叉樹
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- Android遍歷所有控制元件的遞迴和非遞迴實現Android控制元件遞迴
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的先中後序遍歷二叉樹
- js實現深度優先遍歷和廣度優先遍歷JS
- ast 後序遍歷AST
- 資料結構與演算法——二叉樹的前序遍歷,中序遍歷,後序遍歷資料結構演算法二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 二叉樹非遞迴遍歷二叉樹遞迴
- 二叉樹的所有遍歷非遞迴實現二叉樹遞迴
- 二叉樹的非遞迴遍歷——java實現二叉樹遞迴Java
- 資料結構-樹以及深度、廣度優先遍歷(遞迴和非遞迴,python實現)資料結構遞迴Python
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 二叉樹中序和後序遍歷表示式二叉樹
- [資料結構]二叉樹的前中後序遍歷(遞迴+迭代實現)資料結構二叉樹遞迴
- js物件遍歷順序JS物件
- 【根據前序和中序遍歷構造二叉樹】棧+迭代 || 遞迴二叉樹遞迴
- 資料結構初階--二叉樹(前中後序遍歷遞迴+非遞迴實現+相關求算結點實現)資料結構二叉樹遞迴
- LintCode 前序遍歷和中序遍歷樹構造二叉樹二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- 程式碼隨想錄演算法訓練營,9月9日 | 二叉樹遞迴遍歷,迭代遍歷,層序遍歷演算法二叉樹遞迴
- Java遍歷資料夾的兩種方法(非遞迴和遞迴)Java遞迴
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹