二叉树前中后/层次遍历的递归与非递归形式(c++)
/*
二叉树前中后/层次遍历的递归与非递归形式
*/
//*************** void preOrder1(BinaryTreeNode* pRoot)
{
if(pRoot==NULL)
return;
cout<<pRoot->value;
if(pRoot->left!=NULL)
preOrder1(pRoot->left);
if(pRoot->right!=NULL)
preOrder1(pRoot->right);
} void preOrder2(BinaryTreeNode* pRoot)
{
stack<BinaryTreeNode*> s;
BinaryTreeNode *p=pRoot; if(pRoot==NULL)
return;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
cout<<p->value<<" ";
s.push(p);
p=p->left;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->right;
}
}
} void preOrder2(BinaryTreeNode* pRoot){
if(pRoot==NULL)
return;
stack<BinaryTreeNode*> s;
s.push(root);
BinaryTreeNode* p;
while(!s.empty()){
p = s.top();
cout<<p->data;//遍历根结点
s.pop();
if(p>right){
s.push(p->right); //先将右子树压栈
}
if(p->left){
s.push(p->left); //再将左子树压栈
}
}
} //***************** //中序遍历
void inOrder1(BinaryTreeNode* pRoot)
{
if(pRoot==NULL)
return; if(pRoot->left!=NULL)
inOrder1(pRoot->left);
cout<<pRoot->value;
if(pRoot->right!=NULL)
inOrder1(pRoot->right);
} void inOrder2(BinaryTreeNode* pRoot)
{
stack<BinaryTreeNode*> s;
BinaryTreeNode *p=pRoot; if(pRoot==NULL)
return;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
s.push(p);
p=p->left;
}
if(!s.empty())
{
p=s.top();
cout<<p->value<<" ";
s.pop();
p=p->right;
}
}
} //***************** //后序遍历
void postOrder1(BinaryTreeNode* pRoot)
{
if(pRoot==NULL)
return;
postOrder1(pRoot->left);
postOrder1(pRoot->right);
cout<<pRoot->value<<" ";
} void postOrder2(BinaryTreeNode* pRoot)
{
stack<BinaryTreeNode*> s;
BinaryTreeNode *cur;
BinaryTreeNode *pre=NULL;//记录上一个输出的节点
s.push(pRoot);//根结点入栈
while(!s.empty())
{
cur=s.top();
if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right)))
{
//左孩子和右孩子同时为空,或者当前结点的左孩子或右孩子已经遍历过了
cout<<cur->value<<" ";
s.pop();
pre=cur;
}
else
{
if(cur->right!=NULL)
s.push(cur->right);
if(cur->left!=NULL)
s.push(cur->left);
}
}
} //*****************
//层次遍历,使用队列
void PrintFromTopToBottom(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
return; deque<BinaryTreeNode *> dequeTreeNode; dequeTreeNode.push_back(pRoot);
while(dequeTreeNode.size())
{
BinaryTreeNode *pNode = dequeTreeNode.front();
dequeTreeNode.pop_front();
cout<<pNode->m_nValue<<" ";
if(pNode->m_pLeft)
dequeTreeNode.push_back(pNode->m_pLeft); if(pNode->m_pRight)
dequeTreeNode.push_back(pNode->m_pRight);
}
} //深度优先遍历~先序遍历
void dfs(BinaryTreeNode* root){
stack<BinaryTreeNode* *> nodeStack;
nodeStack.push(root);
Node *node;
while(!nodeStack.empty()){
node = nodeStack.top();
cout<<node->data;//遍历根结点
nodeStack.pop();
if(node->rchild){
nodeStack.push(node->rchild); //先将右子树压栈
}
if(node->lchild){
nodeStack.push(node->lchild); //再将左子树压栈
}
}
} //广度优先遍历~层次遍历
void bfs(BinaryTreeNode* root){
queue<BinaryTreeNode* *> nodeQueue;
nodeQueue.push(root);
Node *node;
while(!nodeQueue.empty()){
node = nodeQueue.front();
nodeQueue.pop();
cout<<node->data;//遍历根结点
if(node->lchild){
nodeQueue.push(node->lchild); //先将左子树入队
}
if(node->rchild){
nodeQueue.push(node->rchild); //再将右子树入队
}
}
}
二叉树前中后/层次遍历的递归与非递归形式(c++)的更多相关文章
- Qt实现 动态化遍历二叉树(前中后层次遍历)
binarytree.h 头文件 #ifndef LINKEDBINARYTREE_H #define LINKEDBINARYTREE_H #include<c++/algorithm> ...
- C++二叉树前中后序遍历(递归&非递归)统一代码格式
统一下二叉树的代码格式,递归和非递归都统一格式,方便记忆管理. 三种递归格式: 前序遍历: void PreOrder(TreeNode* root, vector<int>&pa ...
- [C++] 非递归实现前中后序遍历二叉树
目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问 ...
- Binary Tree Traversal 二叉树的前中后序遍历
[抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...
- POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)
链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...
- 数据结构-C语言递归实现树的前中后序遍历
#include <stdio.h> #include <stdlib.h> typedef struct tree { int number ; struct tree *l ...
- C++实现对树的创建和前中后序遍历
#include<iostream>#include<stdio.h> using namespace std; class BitNode{ public: char dat ...
- 飘逸的python - 极简的二叉树前中后序通杀函数
对于任一结点.能够按某种次序运行三个操作: 訪问结点本身(N) 遍历该结点的左子树(L) 遍历该结点的右子树(R) 用来表示顺序,即,前序NLR/中序LNR/后序LRN. 以下我们用namedtupl ...
- 前中后序递归遍历树的体会 with Python
前序:跟->左->右 中序:左->根->右 后序:左>右->根 采用递归遍历时,编译器/解释器负责将递归函数调用过程压入栈并保护现场,在不同位置处理根节点即可实现不 ...
随机推荐
- [BZOJ4044]Virus synthesis 回文自动机的DP
4044: [Cerc2014] Virus synthesis Time Limit: 20 Sec Memory Limit: 128 MB Description Viruses are us ...
- Nginx 线上配置实例
1 /etc/nginx/nginx.conf,在主配置下设置 /etc/nginx/conf.d/*.conf user nginx;worker_processes 1; error_log /v ...
- [UVALive 3902] Network
图片加载可能有点慢,请跳过题面先看题解,谢谢 一道简单的贪心题,而且根节点已经给你了(\(S\)),这就很好做了. 显然,深度小于等于 \(k\) 的都不用管了(\(S\) 深度为0),那么我们只需要 ...
- Container With Most Water - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Container With Most Water - LeetCode 注意点 没什么好注意的... 解法 解法一:暴力求解,假设任意两个端点会是最佳答 ...
- hadoop进阶----hadoop经验(一)-----生产环境hadoop部署在超大内存服务器的虚拟机集群上vs几个内存较小的物理机
生产环境 hadoop部署在超大内存服务器的虚拟机集群上 好 还是 几个内存较小的物理机上好? 虚拟机集群优点 虚拟化会带来一些其他方面的功能. 资源隔离.有些集群是专用的,比如给你三台设备只跑一个 ...
- Android仿iPhone 滚轮控件 实现
Android_开发 实用滚轮效果选择数字http://blog.csdn.net/zhangtengyuan23/article/details/8653771 Android仿iPhone滚轮控件 ...
- java CPU 100% 排查(转载)
一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hank ...
- 使用Hystrix实现自动降级与依赖隔离-微服务
转载: https://www.jianshu.com/p/138f92aa83dc Hystrix出现的原因: hystrix是netflix开源的一个容灾框架,解决当外部依赖故障时拖垮业务系统.甚 ...
- 科学计算三维可视化---Mayavi入门(Mayavi介绍和安装)
Mayavi介绍 是基于VTK开发的可视化软件(更加高效),Mayavi完全由python编写,方便使用,而且可以使用python编写扩展,嵌入到用户程序中 安装要求 VTK >pip3 ins ...
- seaborn基础整理
seaborn是基于matplotlib的更高级的做图工具,下面主要针对以下几个部分进行整理: 第一部分:https://douzujun.github.io/page/%E6%95%B0%E6%8D ...