二叉树后序遍历递归+非递归

来源:互联网 发布:爱奇艺会员领取软件 编辑:程序博客网 时间: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
原创粉丝点击