二叉树中序遍历递归+非递归
来源:互联网 发布:淘宝邮箱格式怎么写 编辑:程序博客网 时间:2024/06/07 11:27
二叉树中序遍历的顺序是左、根、右,递归算法的写法和先序遍历,后序遍历的唯一区别就是访问节点的函数放置的位置不同。非递归还是利用栈来实现,算法思想是从根节点开始,如果当前节点非空则压入栈中,然后将当前节点的左子节点作为当前节点;如果当前节点为空则把栈顶元素作为当前节点,并出栈,然后立即访问当前节点,再将当前节点的右子节点作为当前结点。重复上述步骤,直到栈为空且当前节点为NULL。代码如下:
1.递归方式
#include "stdafx.h"#include<iostream>#include <stack>#include <vector>using namespace std;typedef struct binary_tree_node{struct binary_tree_node* left;struct binary_tree_node* right;int data;}Binary_Tree_Node;void visit(Binary_Tree_Node* pNode){if (pNode!=NULL){cout<<pNode->data<<" ";}}Binary_Tree_Node* create_tree(vector<int> dataVec);void insert_node(Binary_Tree_Node* root,int data);void in_order(Binary_Tree_Node* root);void free_node(Binary_Tree_Node* root);int _tmain(int argc, _TCHAR* argv[]){int tmpArray[]={1,2,3,4,5,6,7};vector<int> input(tmpArray,tmpArray+7);Binary_Tree_Node *root=create_tree(input);in_order(root);free_node(root);return 0;}Binary_Tree_Node* create_tree(vector<int> dataVec){if (dataVec.size()==0){return nullptr;}Binary_Tree_Node *root=new Binary_Tree_Node();root->left=NULL;root->right=NULL;root->data=dataVec[0];for (int i=1;i<dataVec.size();++i){insert_node(root,dataVec[i]);}return root;}void insert_node(Binary_Tree_Node* root,int data){if (root->left==NULL){Binary_Tree_Node* leftChild=new Binary_Tree_Node();leftChild->left=NULL;leftChild->right=NULL;leftChild->data=data;root->left=leftChild;return;}if (root->right==NULL){Binary_Tree_Node* leftChild=new Binary_Tree_Node();leftChild->left=NULL;leftChild->right=NULL;leftChild->data=data;root->right=leftChild;return;}insert_node(root->left,data);}void in_order(Binary_Tree_Node* root){if (root==NULL){return;}if (root->left!=NULL){in_order(root->left);}visit(root);if (root->right!=NULL){in_order(root->right);}}void free_node(Binary_Tree_Node* root){if (root->left!=NULL){free_node(root->left);}if (root->right!=NULL){free_node(root->right);}delete root;root=NULL;}
2.非递归方式
#include "stdafx.h"#include<iostream>#include <stack>#include <vector>using namespace std;typedef struct binary_tree_node{struct binary_tree_node* left;struct binary_tree_node* right;int data;}Binary_Tree_Node;void visit(Binary_Tree_Node* pNode){if (pNode!=NULL){cout<<pNode->data<<" ";}}Binary_Tree_Node* create_tree(vector<int> dataVec);void insert_node(Binary_Tree_Node* root,int data);void in_order(Binary_Tree_Node* root);void free_node(Binary_Tree_Node* root);int _tmain(int argc, _TCHAR* argv[]){int tmpArray[]={1,2,3,4,5,6,7};vector<int> input(tmpArray,tmpArray+7);Binary_Tree_Node *root=create_tree(input);in_order(root);free_node(root);return 0;}Binary_Tree_Node* create_tree(vector<int> dataVec){if (dataVec.size()==0){return nullptr;}Binary_Tree_Node *root=new Binary_Tree_Node();root->left=NULL;root->right=NULL;root->data=dataVec[0];for (int i=1;i<dataVec.size();++i){insert_node(root,dataVec[i]);}return root;}void insert_node(Binary_Tree_Node* root,int data){if (root->left==NULL){Binary_Tree_Node* leftChild=new Binary_Tree_Node();leftChild->left=NULL;leftChild->right=NULL;leftChild->data=data;root->left=leftChild;return;}if (root->right==NULL){Binary_Tree_Node* leftChild=new Binary_Tree_Node();leftChild->left=NULL;leftChild->right=NULL;leftChild->data=data;root->right=leftChild;return;}insert_node(root->left,data);}void in_order(Binary_Tree_Node* root){if (root==NULL){return;}stack<Binary_Tree_Node*> pStack;Binary_Tree_Node *curNode=root;while(!pStack.empty() || curNode!=NULL){if (curNode!=NULL){pStack.push(curNode);curNode=curNode->left;}else{Binary_Tree_Node *tmpNode=pStack.top();pStack.pop();visit(tmpNode);curNode=tmpNode->right;}}}void free_node(Binary_Tree_Node* root){if (root->left!=NULL){free_node(root->left);}if (root->right!=NULL){free_node(root->right);}delete root;root=NULL;}上述程序生成的二叉树如下图:
中序遍历程序结果如下:
0 0
- 二叉树中序遍历(递归+非递归)
- 二叉树中序递归、非递归遍历
- 二叉树中序遍历递归+非递归
- 非递归二叉树中序遍历
- 二叉树中序遍历非递归
- 二叉树中序遍历(非递归)
- 二叉树中序遍历非递归
- 二叉树中序遍历 递归和非递归遍历
- 二叉树中序遍历的非递归算法
- 二叉树中序遍历非递归算法.
- 二叉树中序遍历非递归算法详解
- 二叉树中序遍历的非递归算法
- 二叉树中序遍历非递归算法
- 二叉树中序遍历的非递归方法
- 二叉树中序遍历的非递归实现
- 二叉树中序遍历,非递归,用栈
- 二叉树中序遍历的非递归算法
- 二叉树中序遍历非递归算法
- 实施hybris必须懂java吗
- 利用人体肤色从图像中分割出人体区域的OpenCV代码
- 开机启动 APK
- 搭建简单的Web服务器
- ubuntu下制作u盘安装win7盘,以及win7下制作ubuntu盘
- 二叉树中序遍历递归+非递归
- 值得推荐的C/C++框架和库
- bitmap压缩后保存到本地(只压缩质量,不压缩像素)
- 暑期十测 round1
- Android 通过JNI实现守护进程,使得Service服务不被杀死
- MFC中的RTTI(Runtime Type Identification, 运行时类型识别)详解(参考《深入浅出MFC》)
- animationWithKeyPath的值
- 快速幂二进制取模算法
- 58. Length of Last Wor