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

#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中的栈来实现,由非递归建立二叉树方法建立了一个二叉树。。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值