#include<iostream>
#include<stack>
using namespace std;
#define MAX_SIZE 50
typedef 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.youkuaiyun.com/Hackbuteer1/article/details/6686858
http://blog.youkuaiyun.com/Hackbuteer1/article/details/8022138
本章主要学习了二叉树的非递归遍历方法,分别使用自己定义的栈和STL中的栈来实现,由非递归建立二叉树方法建立了一个二叉树。。。。