二叉树的递归和非递归遍历

来源:互联网 发布:win10用什么编程软件 编辑:程序博客网 时间:2024/05/14 00:01
#include<iostream>#include<stack>using namespace std;#define MAX_SIZE  50typedef struct BiTNode{char data;struct BiTNode *lChild,*rChild;}BiTreeNode,*BiTree;BiTree CreateTree_NonRecur(char* str); //非递归建立二叉树BiTreeNode* CreateNode(char* str);//创建节点// 递归遍历二叉树void PreOrderTraverse(BiTree& root);void InOrderTraverse(BiTree& root);void PostOrderTraverse(BiTree& root);//非递归遍历void PreOrder_NonRecur(BiTree& root);void PreOrder_NonRecur2(BiTree& root);void InOrder_NonRecur(BiTree &root);void PostOrder_NonRecur(BiTree& root);int main(){char str[] = "abc@@@de@@f@@";BiTree root;root = CreateTree_NonRecur(str);PreOrder_NonRecur2(root);//PreOrderTraverse(root);//InOrderTraverse(root);//PostOrderTraverse(root);return 1;}BiTreeNode* CreateNode(char* str){BiTreeNode* temp = (BiTreeNode*)malloc(sizeof(BiTreeNode));if(temp == NULL){cout<<"内存分配失败";exit(1);}temp->data = *str;temp->lChild = NULL;temp->rChild = NULL;return temp;}BiTree CreateTree_NonRecur(char* str)  //非递归建立二叉树{if('\0' == *str || '@' == *str){cout<<"创建一颗空的二叉树";return NULL;}BiTreeNode* stack[MAX_SIZE];int top =0;BiTreeNode* root;BiTreeNode* tempRoot;BiTreeNode* tempNode = NULL;root = CreateNode(str);tempRoot = root;while( *str != '\0'){str++;if(*(str-1) != '@'){stack[top++] = tempRoot;if(*str != '@'){tempNode = CreateNode(str);tempRoot->lChild = tempNode;tempRoot = tempNode;}else{tempRoot->lChild =NULL;}}if(*(str-1) == '@' && top != 0){tempRoot = stack[--top];if(*str != '@'){tempNode = CreateNode(str);tempRoot->rChild = tempNode;tempRoot = tempNode;}else{tempRoot->rChild =NULL;}}}return root;}//递归遍历二叉树void PreOrderTraverse(BiTree &root){if(root == NULL)return;cout<<root->data<<" ";PreOrderTraverse(root->lChild);PreOrderTraverse(root->rChild);}void InOrderTraverse(BiTree& root){if(root == NULL)return;InOrderTraverse(root->lChild);cout<<root->data<<" ";InOrderTraverse(root->rChild);}void PostOrderTraverse(BiTree& root){if(root == NULL)return;PostOrderTraverse(root->lChild);PostOrderTraverse(root->rChild);cout<<root->data<<" ";}void PreOrder_NonRecur(BiTree& root){if(root == NULL){cout<<"空树";return;}stack<BiTreeNode*> st;st.push(root);while(!st.empty()){BiTree temp = st.top();cout<< temp->data<<" ";st.pop();if(temp->rChild)        //先将又子树压入栈,以保证在弹出时总是先弹出左子树st.push(temp->rChild);if(temp->lChild)st.push(temp->lChild);}}void PreOrder_NonRecur2(BiTree& root)  //先序非递归第二种方法{if(root == NULL)return;stack<BiTree> st;while(root)     //先将左子树全部压入栈中{st.push(root);cout<<root->data<<" ";root = root->lChild;}while(!st.empty()){BiTree temp = st.top()->rChild;   //若当前节点有右子树,则对又子树根节点的左子树//进行相同的压栈操作,若没有右子树则出栈st.pop();while(temp){cout<<temp->data<<" ";st.push(temp);temp = temp->lChild;}}}void InOrder_NonRecur(BiTree& root){if(root == NULL)return;stack<BiTree> st;BiTreeNode * cur = root->lChild;  //cur指向当前节点st.push(root);while(cur != NULL || !st.empty()) //当前指针不为空或者栈不为空,只要有一个成立,循环继续{while(cur != NULL)// 向左走到底{st.push(cur);cur = cur->lChild;}cur = st.top();  //指向栈顶元素st.pop();        cout<<cur->data<<" ";cur = cur->rChild;}}void PostOrder_NonRecur(BiTree& root){}void PostOrder_NonRecur(BiTree T)  // 后序遍历的非递归     双栈法  {        stack<BiTree> s1 , s2;        BiTree curr ;           // 指向当前要检查的节点      s1.push(T);      while(!s1.empty())  // 栈空时结束        {          curr = s1.top();          s1.pop();          s2.push(curr);          if(curr->lChild)              s1.push(curr->lChild);          if(curr->rChild)              s1.push(curr->rChild);      }      while(!s2.empty())      {          printf("%c ", s2.top()->data);          s2.pop();      }  } 

更多二叉树的操作可见

http://blog.csdn.net/Hackbuteer1/article/details/6686858 

http://blog.csdn.net/Hackbuteer1/article/details/8022138


本章主要学习了二叉树的非递归遍历方法,分别使用自己定义的栈和STL中的栈来实现,由非递归建立二叉树方法建立了一个二叉树。。。。