树的递归遍历和非递归遍历(前序和后序)

来源:互联网 发布:php 魔术方法 编辑:程序博客网 时间:2024/05/23 11:30
/********************************************树的递归遍历和非递归遍历********************************************/#include<iostream>#include<stack>using namespace std;struct Node{Node(int v=0,Node* l=NULL,Node* r=NULL){value=v;left=l;right=r;flag=0;}int value;Node* left;Node* right;int flag;  //主要是为了非递归后序遍历添加的标识符 0:表示还没有处理该节点,1:已处理该节点};stack<Node*> myStack;void traverseTreeRecursePreOrder(Node* root)  //递归实现---前序遍历{if(!root)return;cout<<root->value<<" ";traverseTreeRecursePreOrder(root->left);traverseTreeRecursePreOrder(root->right);}void traverseTreeNoRecursePreOrder(Node* root)  //非递归实现---前序遍历{myStack.push(root);Node* temp;while(!myStack.empty()){temp=myStack.top();myStack.pop();if(temp->right)myStack.push(temp->right);if(temp->left)myStack.push(temp->left);cout<<temp->value<<" ";}}void traverseTreeRecursePostOrder(Node* root)  //递归实现---后序遍历{if(!root)return;traverseTreeRecursePostOrder(root->left);traverseTreeRecursePostOrder(root->right);cout<<root->value<<" ";}/************************************每次取栈顶上的节点,再把该节点的左右子节点放入到栈中。。。(先放右节点)这样会使每次加入的右节点的子节点没有放入栈中,所以要设置一个标志:flag。************************************/void traverseTreeRecurseNoPostOrder(Node* root)  //非递归实现---后序遍历{myStack.push(root);Node* temp;while(!myStack.empty()){temp=myStack.top();if(!temp->left&&!temp->right)//到达叶节点,输出,出栈{cout<<temp->value<<" ";myStack.pop();continue;}if(!temp->flag)//flag=0:表示还没放入该节点的子节点,入栈{if(temp->right)myStack.push(temp->right);temp->flag=1;if(temp->left)myStack.push(temp->left);}//flag=1:表示已放入该节点的子节点,直接输出,出栈else{cout<<temp->value<<" ";myStack.pop();}}}Node* buildTree(){Node* node7=new Node(7);Node* node3=new Node(3);Node* node5=new Node(5);Node* node8=new Node(8);Node* node1=new Node(1,node8,NULL);Node* node2=new Node(2,node1,node3);Node* node6=new Node(6,node5,node7);Node* node4=new Node(4,node2,node6);return node4;}void main(){Node* root=buildTree();traverseTreeRecursePreOrder(root);cout<<endl;traverseTreeNoRecursePreOrder(root);cout<<endl;traverseTreeRecursePostOrder(root);cout<<endl;traverseTreeRecurseNoPostOrder(root);}


原创粉丝点击