1.二叉树的实现

按前序遍历进行输入,#表示空树

struct node{char data;struct node *left, *right;
};class tree{
public:tree();~tree();node *getRoot(){return root;}int Depth(node *);void PreOrder(node * );void InOrder(node *);void PostOrder(node *);void LayerTravel(node *);void PrintLevel(node *, int);void NonrePreOrder(node *);void NonreInOrder(node *);void NonrePostOrder(node *);void NonreLayerTravel(node *);private:node* root;node* creat();
};

构造函数

tree::tree(){this->root = creat();
}

creat()方法

node* tree::creat(){node* root;char ch;cout<<"Input:"<<endl;cin>>ch;if(ch == '#')root = NULL;else{root = new node;root->data = ch;root->left = creat();root ->right = creat();}return root;
}

2.二叉树的遍历

1.递归前序遍历

void tree::PreOrder(node* root){if(root!=NULL){cout<<root->data<<" ";PreOrder(root->left);PreOrder(root->right);}
}

2.递归中序遍历

void tree::InOrder(node* root){if(root!=NULL){InOrder(root->left);cout<<root->data<<" ";InOrder(root->right);}
}

3.递归后序遍历

void tree::PostOrder(node* root){if(root!=NULL){PostOrder(root->left);PostOrder(root->right);cout<<root->data<<" ";}
}

4.递归层次遍历

递归求树的高度

int tree::Depth(node *root){if(root==NULL)return 0;return 1 + max(Depth(root->left),Depth(root->right));
}
void tree::LayerTravel(node* root){if(root!=NULL){int depth = Depth(root);int i;for(i=1;i<=depth;i++){PrintLevel(root,i);cout<<endl;}}
}
void tree::PrintLevel(node* root,int level){if(root == NULL || level < 1) return;if(1==level){cout<<root->data<<" ";return;}PrintLevel(root->left,level-1);PrintLevel(root->right,level-1);
}

5.非递归前序遍历

void tree::NonrePreOrder(node* root){stack<node*> s;node* p = root;do{while(p){cout<<p->data<<" ";s.push(p);p = p->left;}if(!s.empty()){p = s.top();s.pop();p = p->right;}}while(p||!s.empty());
}

6.非递归中序遍历

void tree::NonreInOrder(node* root){stack<node*> s;node* p = root;do{while(p){s.push(p); p = p->left;}if(!s.empty()){p=s.top();s.pop();cout<<p->data<<" ";p = p->right;}}while(p||!s.empty());
}

7.非递归后序遍历


void tree::NonrePostOrder(node* root){if (root == NULL) return;stack<node*> s;s.push(root);node* head = root;while (!s.empty()){node* t = s.top();if (!t->left&&!t->right || t->left == head || t->right == head){cout<<t->data<<" ";s.pop();head = t;}else{if (t->right)s.push(t->right);if (t->left)s.push(t->left);}}
}

8.非递归层次遍历

void tree::NonreLayerTravel(node* root){if (root == NULL)return;queue<node*> q;q.push(root);while (!q.empty()){//计算当前队列中含有多少元素int size = q.size();//从头部依次取出size个元素for (int i = 0; i < size; i++){root = q.front();q.pop();cout<<root->data<<" ";//将下一层的元素塞入队列if (root->left)q.push(root->left);if (root->right)q.push(root->right);}}
}

3.完整代码

头文件a.h

#ifndef A_H_INCLUDED
#define A_H_INCLUDED
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
/
struct node{char data;struct node *left, *right;
};class tree{
public:tree();~tree();node *getRoot(){return root;}int Depth(node *);void PreOrder(node * );void InOrder(node *);void PostOrder(node *);void LayerTravel(node *);void PrintLevel(node *, int);void NonrePreOrder(node *);void NonreInOrder(node *);void NonrePostOrder(node *);void NonreLayerTravel(node *);private:node* root;node* creat();
};tree::tree(){this->root = creat();
}node* tree::creat(){node* root;char ch;cout<<"Input:"<<endl;cin>>ch;if(ch == '#')root = NULL;else{root = new node;root->data = ch;root->left = creat();root ->right = creat();}return root;
}
int tree::Depth(node *root){if(root==NULL)return 0;return 1 + max(Depth(root->left),Depth(root->right));
}void tree::PreOrder(node* root){if(root!=NULL){cout<<root->data<<" ";PreOrder(root->left);PreOrder(root->right);}
}void tree::InOrder(node* root){if(root!=NULL){InOrder(root->left);cout<<root->data<<" ";InOrder(root->right);}
}void tree::PostOrder(node* root){if(root!=NULL){PostOrder(root->left);PostOrder(root->right);cout<<root->data<<" ";}
}void tree::LayerTravel(node* root){if(root!=NULL){int depth = Depth(root);int i;for(i=1;i<=depth;i++){PrintLevel(root,i);cout<<endl;}}
}void tree::PrintLevel(node* root,int level){if(root == NULL || level < 1) return;if(1==level){cout<<root->data<<" ";return;}PrintLevel(root->left,level-1);PrintLevel(root->right,level-1);}void tree::NonrePreOrder(node* root){stack<node*> s;node* p = root;do{while(p){cout<<p->data<<" ";s.push(p);p = p->left;}if(!s.empty()){p = s.top();s.pop();p = p->right;}}while(p||!s.empty());
}void tree::NonreInOrder(node* root){stack<node*> s;node* p = root;do{while(p){s.push(p); p = p->left;}if(!s.empty()){p=s.top();s.pop();cout<<p->data<<" ";p = p->right;}}while(p||!s.empty());
}void tree::NonrePostOrder(node* root){if (root == NULL) return;stack<node*> s;s.push(root);node* head = root;while (!s.empty()){node* t = s.top();if (!t->left&&!t->right || t->left == head || t->right == head){cout<<t->data<<" ";s.pop();head = t;}else{if (t->right)s.push(t->right);if (t->left)s.push(t->left);}}
}void tree::NonreLayerTravel(node* root){if (root == NULL)return;queue<node*> q;q.push(root);while (!q.empty()){//计算当前队列中含有多少元素int size = q.size();//从头部依次取出size个元素for (int i = 0; i < size; i++){root = q.front();q.pop();cout<<root->data<<" ";//将下一层的元素塞入队列if (root->left)q.push(root->left);if (root->right)q.push(root->right);}}
}
/
#endif // A_H_INCLUDED

测试代码main.cpp

#include "a.h"
#include <iostream>
using namespace std;
int main(){tree *mytree = new tree();cout<<"Creat sucessfully!!"<<endl;node* myroot = mytree->getRoot();cout<<"-------------------------------------"<<endl;cout<<"The depth is:"<<mytree->Depth(myroot)<<endl;cout<<"-------------------------------------"<<endl;cout<<"Recursive Traversal"<<endl;cout<<" Preorder Traversal:  ";mytree->PreOrder(myroot);cout<<endl;cout<<"  Inorder Traversal:  ";mytree->InOrder(myroot);cout<<endl;cout<<"Postorder Traversal:  ";mytree->PostOrder(myroot);cout<<endl;cout<<"    Layer Traversal:  ";cout<<endl;mytree->LayerTravel(myroot);cout<<endl;cout<<"-------------------------------------"<<endl;cout<<"Nonrecursive Traversal"<<endl;cout<<" Preorder Traversal:  ";mytree->NonrePreOrder(myroot);cout<<endl;cout<<"  Inorder Traversal:  ";mytree->NonreInOrder(myroot);cout<<endl;cout<<"Postorder Traversal:  ";mytree->NonrePostOrder(myroot);cout<<endl;cout<<"    Layer Traversal:  ";mytree->NonreLayerTravel(myroot);cout<<endl;cout<<"-------------------------------------"<<endl;return 0;
};

测试结果(要构造如下所示的二叉树)

按如下进行输入(按前序遍历进行输入,#表示空树)

结果如图

Tree(3)--二叉树的实现及四种遍历(递归/非递归)相关推荐

  1. 二叉树的四种遍历(非递归)

    class treeNode:def __init__(self, val, left=None, right=None):self.val = valself.left = leftself.rig ...

  2. # 遍历结构体_关于二叉树怎样建立和四种遍历方法你知道吗?

    1. 首先我们要知道二叉树的性质是什么2. 怎样建立二叉搜索树?3. 先序遍历4. 中序遍历5. 后序遍历6. 总结上述三种遍历规律7. 层序遍历 1. 首先我们要知道二叉树的性质是什么 在二叉树上, ...

  3. 按照前序遍历创建二叉树及树的四种遍历方式

    一.二叉树的介绍 二叉树的特点是二叉树的每个结点的度都不大于2,可以视为每个结点都有左孩子和右孩子.故二叉树结点的数据结构为 二.二叉树的特点 1.设根结点所在的层数为第1层,则第i层最多有个结点. ...

  4. 常用数据结构之二叉树及树的四种遍历方式

    1.树 我们选择一种数据结构,不仅要能存储数据,而且要能体现数据之间的关系.目前数据主要有是三种关系一对一.一对多.多对多:之前我们讨论了线性表(数组.链表.栈.队列),其中的元素具有一对一的关系,通 ...

  5. 二叉树总结—建树和4种遍历方式(递归非递归)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...

  6. Java实现二叉树的创建与四种遍历方式(前,中,后,层)

    文章目录 1.二叉树节点的创建 2.二叉树的先序遍历 3.二叉树的中序遍历 4.二叉树的后序遍历 5.二叉树的层序遍历

  7. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

  8. 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)

    目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...

  9. 二叉树的四种遍历方式

    二叉树的四种遍历方式: 二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次. 四种遍历方式分别为 ...

最新文章

  1. 2015 年最受 Linux 爱好者欢迎的软硬件大盘点
  2. Android之利用JSBridge库实现Html,JavaScript与Android的所有交互
  3. @transaction 提交事务_Kafka 事务实现原理
  4. 面向对象程序中的常量
  5. 京东网络接入体系解密之高性能四层网关DLVS
  6. 【机器学习基础】一文看透多任务学习
  7. node.js 中的package.json文件怎么创建?
  8. Angular实现tab切换
  9. Java LinkedHashMap类
  10. 10.程序员的自我修养---内存
  11. 自定义的BaseAdapter实现LIstView的展示
  12. scala条件替换_Scala:如何使用scala替换Dataframe中的值
  13. weblogic 下载地址
  14. 【设计模式】-工厂模式->工厂方法模式(源码与类图解析)
  15. 阿里巴巴数据中台实践(PPT)
  16. 商务与经济统计 --假设检验
  17. python读取excel数据绘制简单曲线图
  18. FileBeat笔记(一)——安装和采集Springboot日志
  19. Laravel执行定时任务
  20. 关于手机输入法的一些点子

热门文章

  1. 人工智能的智能医疗机器人:实现智能辅助、提高医疗效率
  2. AndroidBug5497Workaround 修改
  3. 我要去见最酷的硅谷华人程序员
  4. scratch森林运动会 电子学会图形化编程scratch等级考试四级真题和答案解析2021-12
  5. Debain10忘记root用户密码怎么办
  6. 走进Vue【四】导航守卫和路由原信息详解
  7. 介绍微软一个罕为人知的无敌命令(转)
  8. Python项目实战 3.2:验证码.短信验证码
  9. 2022.4.27 Burpsuite安装之Java环境配置
  10. 调用阿里API实现全国快递物流查询