二叉树后序遍历递归+非递归
来源:互联网 发布:爱奇艺会员领取软件 编辑:程序博客网 时间:2024/05/31 11:04
二叉树后序遍历顺序是左、根、右,递归方法和先序中序唯一的区别是访问函数的位置不同;非递归方式也是利用栈实现,主要算法思想是设置一个last指针记录最近一次访问的节点,初始值为NULL,从根节点开始如果当前节点非空就入栈,并将左子节点作为当前节点,如果当前节点为空,就把栈顶元素作为当前节点,然后判断右子节点是否等于last指针指向的节点,若是则访问当前节点,并弹出栈顶元素;若不是则将当前节点的右子节点作为当前节点,并将last指针重新赋值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 post_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);post_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 post_order(Binary_Tree_Node* root){if (root==NULL){return;}if (root->left!=NULL){post_order(root->left);}if (root->right!=NULL){post_order(root->right);}visit(root);}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 post_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);post_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 post_order(Binary_Tree_Node* root){if (root==NULL){return;}stack<Binary_Tree_Node*> pStack;Binary_Tree_Node *curNode=root;Binary_Tree_Node *lastNode=NULL;while(curNode!=NULL || !pStack.empty()){if (curNode!=NULL){pStack.push(curNode);curNode=curNode->left;}else{Binary_Tree_Node *tmpNode=pStack.top();if (tmpNode->right==lastNode){visit(tmpNode);lastNode=tmpNode;pStack.pop();}else{curNode=tmpNode->right;lastNode=NULL;}}}}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
- 二叉树后序递归、非递归遍历
- 二叉树后序遍历递归+非递归
- 二叉树后序遍历(非递归)
- 二叉树后序遍历(非递归)
- 二叉树后序遍历(非递归)
- 二叉树后序遍历(非递归)
- 二叉树后序遍历非递归
- 二叉树后序遍历(非递归)
- 二叉树后序遍历非递归
- 二叉树后序遍历的非递归算法
- 二叉树后序遍历非递归实现
- 二叉树后序遍历非递归算法
- 二叉树后序遍历(非递归算法)
- 二叉树后序遍历非递归算法
- 二叉树后序遍历的非递归算法
- 二叉树后序遍历的非递归算法
- Lintcode 二叉树后序遍历 非递归形式
- 二叉树后序遍历非递归实现
- 软件升级包封装方法以及软件升级方法
- 矩阵范数求导规则
- JDBC之调用存储过程
- hdu 5724 Chess(SG函数)
- 项目正在用 非常实用的 maven的构件实现
- 二叉树后序遍历递归+非递归
- 【NOIP2012】 Vigenère密码
- soft raid5阅读笔记之九--MD中的superblock
- 过滤器的使用:下载计数过滤器
- Android全部源码导入Eclipse
- 微信错误:errcode=45015, errmsg=response out of time limit or subscription is canceled
- POJ 1915 BFS题目
- soft raid5阅读笔记之十--状态标志
- Android之AsyncTask异步加载(三)