二叉树的递归和非递归遍历
来源:互联网 发布: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中的栈来实现,由非递归建立二叉树方法建立了一个二叉树。。。。
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉搜索树的递归遍历和非递归遍历
- java 二叉树的递归遍历和非递归遍历
- 递归 和 非递归 遍历二叉树
- 递归和非递归遍历二叉树
- 递归和非递归遍历二叉树
- 二叉树递归和非递归遍历
- 二叉树递归和非递归遍历
- 递归和非递归遍历二叉树
- 二叉树的递归和非递归的遍历算法
- 二叉树的前序中序后序的递归和非递归遍历
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- C语言中的变量的存储类型
- C++ MFC学习笔记二
- Blue Indian's Puzzler Keygenme
- IOS开发本地化教程–For xcode4(本地化)
- servlet的那些小事儿
- 二叉树的递归和非递归遍历
- boost库中thread多线程详解2——mutex与lock
- eclipse设置智能提示
- hdu 2688 Rotate 树状数组
- web 前端MVC理念的核心思想
- Perl字符串基本操作详解
- boost库中thread多线程详解3——细说lock_guard
- IOS 百度社会化分享注意点
- 【Boost】boost库中thread多线程详解4——谈谈recursive_mutex(递归式互斥量)