递归和非递归方法建立二叉树
2013-08-30 16:45
197 查看
研三了,天天忙着找工作,细数来看过的算法也算多了,但是都是在不同的电脑上看的,而且都没有记录,因此开通此博客用于记录平时看书的笔记或者笔试题目,算法等的解释,写于此便于自己日后回顾和让其他在招工的同学们可以看到。
此文是在学习其他人算法的时候对非递归建立二叉树算法的优化,不一定是最好的,只是能够得出结果,希望有大牛看到此文章能够推荐更好的解法,或者对此算法提出优化意见。。谢谢
#include<iostream> using namespace std; typedef struct BiTreeNode { char data; struct BiTreeNode *lChild,*rChild; }*BiTree,BiTreeNode; #define MAXSIZE 50 //BiTreeNode* stack[MAXSIZE]; //穿件二叉树节点栈 //int top =0; //函数声明 BiTree CreateBiTree(); //递归建立二叉树 void PreOrderTraverse(const BiTree& root); void InOrderTraverse(const BiTree& root); void PostOrderTraverse(const BiTree& root); BiTree CreateBiTreeNonRecur(char *str);//非递归建立二叉树 BiTreeNode* CreateNode(char* data); //创建二叉树节点; int main() { BiTree root; //cout<<"请输入根节点的值: "; //root = CreateBiTree(); char str[] ="ABC@G@@@DE@@@"; root = CreateBiTreeNonRecur(str); PreOrderTraverse( root); return 1; } BiTree CreateBiTree() { char ch; cin>>ch; if(ch == '@') return NULL; BiTreeNode * tempNode = (BiTreeNode*)malloc(sizeof(BiTreeNode)); if(tempNode == NULL) { cout<<"内存分配失败"; return NULL; } tempNode->data = ch; cout<<"请输入节点 "<<ch <<" 的左节点: "; tempNode->lChild = CreateBiTree(); cout<<"请输入节点 "<<ch <<" 的右节点: "; tempNode->rChild = CreateBiTree(); return tempNode; } void PreOrderTraverse(const BiTree& root) { if(root == NULL) return; cout<<root->data<<" "; PreOrderTraverse(root->lChild); PreOrderTraverse(root->rChild); } //非递归建立二叉树 BiTreeNode* CreateNode(char* data) //创建一个节点 { BiTreeNode* temp = (BiTreeNode*)malloc(sizeof(BiTreeNode)); temp->data = *data; temp->lChild = NULL; temp->rChild = NULL; return temp; } BiTree CreateBiTreeNonRecur(char* str) { BiTreeNode* stack[MAXSIZE]; int top = 0; if(*str == '\0') { cout<<"创建一个空的二叉树"; return NULL; } BiTreeNode* root = NULL; BiTreeNode* tempRoot = NULL; //当前指向节点 BiTreeNode* temp =NULL; root = CreateNode(str); tempRoot = root; while(*str != '\0') { str++; if(*(str-1)!= '@') //建树过程中如果一直未碰到@符号,则持续建立左子树 { //并将节点压入栈中 stack[top++] = tempRoot; if(*str != '@') //判断当前节点是不是@节点,如果是的左子树为空 { temp = CreateNode(str); tempRoot->lChild = temp; tempRoot = temp; } else { tempRoot->lChild =NULL; } } if(*(str-1) =='@' && top >0) //若前一个节点是@,则出栈,建立右子树 { tempRoot = stack[--top]; if(*str != '@')//判断当前节点是不是@节点,如果是的右子树为空 { temp = CreateNode(str); tempRoot->rChild = temp; tempRoot = temp; } else tempRoot->rChild =NULL; } } return root; }
相关文章推荐
- 用递归方法建立二叉树
- 用递归方法建立二叉树
- 用递归方法建立二叉树
- 用递归方法建立二叉树
- 非递归队列方法建立二叉树
- java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能
- 二叉树的建立、三种(递归、非递归)遍历方法
- 根据前序跟中序遍历的结果建立二叉树——迭代和递归的方法
- 非递归方法实现 二叉树的 DFS(Pre Order), Post Order
- 二叉树的三种遍历方法(递归和非递归)
- 递归和非递归俩种方法实现二叉树的前序遍历
- 用递归的方法进行二叉树的搜索和插入
- 建一棵二叉树,能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数
- 递归和非递归俩种方法实现二叉树的前序、中序、后续遍历
- 各种方法建立二叉树
- 非递归建立二叉树 c
- 二叉树的建立方法,你都懂吗?
- 二叉树的三种遍历的方法(递归和非递归完整版)
- 二叉树的建立和基本操作(递归实现)
- java二叉树的遍历,递归与非递归方法