二叉树的三种遍历的方法(递归和非递归完整版)

来源:互联网 发布:mysql date add用法 编辑:程序博客网 时间:2024/06/01 07:49
#include<iostream>#include<stack>using namespace std;template<typename T>struct TreeNode{T info;TreeNode<T>* left;TreeNode<T>* right;};template<typename T>void visit(T& info){cout<<info<<endl;}template<typename T>void recursivePreorderTraverse(TreeNode<T>* head){if(head==NULL) return;visit(head->info);recursivePreorderTraverse(head->left);recursivePreorderTraverse(head->right);}template<typename T>void recursiveInorderTraverse(TreeNode<T>* head){if(head==NULL) return;recursiveInorderTraverse(head->left);visit(head->info);recursiveInorderTraverse(head->right);}template<typename T>void recursivePostorderTraverse(TreeNode<T>* head){if(head==NULL) return;recursivePostorderTraverse(head->left);recursivePostorderTraverse(head->right);visit(head->info);}template<typename T>void nonrecusivePreorderTraverse(TreeNode<T>* head){if(head==NULL) return;stack<TreeNode<T>*> treeStack;treeStack.push(head);TreeNode<T>* top=NULL;while(!treeStack.empty()){treeStack.pop(top);visit(top->info);if(top->left!=NULL) treeStack.push(top->left);if(top->right!=NULL) treeStack.push(top->right);}}template<typename T>void nonrecusiveInorderTraverse(TreeNode<T>* head){if(head==NULL) return;stack<TreeNode<T>*> treeStack;TreeNode<T>* index = head;while(index!=NULL||!treeStack.empty()){while(index!=NULL){treeStack.push(index);index = index->left;}if(!treeStack.empty()){treeStack.pop(index);visit(index->info);index = index->right;}}}template<typename T>void nonrecursivePostorderTraverse(TreeNode<T>* head){if(head==NULL) return;stack<TreeNode<T>*> treeStack1;stack<TreeNode<T>*> treeStack2;treeStack1.push(head);while(!treeStack1.empty()){TreeNode<T>* top = treeStack1.top();treeStack1.pop();treeStack2.push(top);if(top->right!=NULL) treeStack1.push(top->right);if(top->left!=NULL) treeStack1.push(top->left);}while(!treeStack2.empty()){TreeNode<T>* top = treeStack2.top();treeStack2.pop();visit(top);}}int main(){}

原创粉丝点击