二叉树遍历

#include <iostream>
#include <stdio.h>
#include<stack>
using namespace std;

typedef struct Node
{
	char data;
	struct Node *left;
	struct Node *right;
}*pNode;

//建立二叉树
void create_tree(pNode &pRoot)
{
	char ch;
	scanf("%c",&ch);
	if(ch=='.')
	{
		pRoot = NULL;
	}
	else
	{
		pRoot = new Node();
		pRoot->left = NULL;
		pRoot->right = NULL;
		
		if(!pRoot)
			return ;
			
		pRoot->data = ch;//给T赋值
		create_tree(pRoot->left);//给左子树赋值
		create_tree(pRoot->right);//给右子树赋值
	}
}


void pre_show(Node *pRoot)//递归前序遍历二叉树
{
	if(pRoot)
	{
		std::cout<<pRoot->data<<" ";
		pre_show(pRoot->left);
		pre_show(pRoot->right);
	}
}

void pre_show_ex(Node* pRoot)//非递归前序遍历
{
	std::stack<Node*> ve;
	pNode tmp = pRoot;
	while(tmp || !ve.empty())
	{
		while(tmp)//显示当前节点信息,遍历该节点左子树
		{
			std::cout<<tmp->data<<" ";
			ve.push(tmp);
			tmp = tmp->left;
		}
		
		if(!ve.empty())//回退当前节点到右子树
		{
			tmp = ve.top();
			ve.pop();
			tmp = tmp->right;
		}
	}
}

void mid_show(Node *pRoot)//中序遍历二叉树
{
	if(pRoot)
	{
		mid_show(pRoot->left);
		std::cout<<pRoot->data<<" ";
		mid_show(pRoot->right);
	}
}

void mid_show_ex(Node* pRoot)//非递归中序遍历
{
	std::stack<Node*> ve;
	pNode tmp = pRoot;
	while(tmp || !ve.empty())
	{
		while(tmp)//遍历该节点左子树
		{
			ve.push(tmp);
			tmp = tmp->left;
		}
		
		if(!ve.empty())//显示当前节点信息,回退当前节点到右子树
		{
            tmp = ve.top();
			ve.pop();
			std::cout<<tmp->data<<" ";
			tmp = tmp->right;
		}
	}
}

void back_show(Node *pRoot)//后序遍历二叉树
{
	if(pRoot)
	{
		back_show(pRoot->left);
		back_show(pRoot->right);
		std::cout<<pRoot->data<<" ";
	}
}

void back_show_ex(Node* pRoot)//非递归后序遍历
{
	std::stack<Node*> ve;
	pNode tmp = pRoot;
	pNode flag = NULL;
	while(tmp || !ve.empty())
	{
		while(tmp)//遍历该节点左子树入栈
		{
			ve.push(tmp);
			tmp = tmp->left;
		}
		
		if(!ve.empty())
		{
            tmp = ve.top();
			if(tmp->right == NULL || flag == tmp->right)//如果没有右子树,或已经被访问过,则输出当前节点,并出栈
			{
				std::cout<<tmp->data<<" ";
				flag = tmp;
				tmp = NULL;
				ve.pop();
			}
			else//否则指向右子树
				tmp = tmp->right;
		}
	}
}


int main()
{
	Node *pRoot;
	std::cout<<"输入一串字符,子树为空,用.来代替"<<std::endl;
	
	create_tree(pRoot);
	std::cout<<"make btree ok"<<std::endl;

	std::cout<<"pre oreder result :";
	pre_show(pRoot);
	
	std::cout<<std::endl<<"pre oreder result--ex :";
	pre_show_ex(pRoot);
	
	std::cout<<std::endl<<"mid oreder result :";
	mid_show(pRoot);
	std::cout<<std::endl<<"mid oreder result-ex :";
	mid_show_ex(pRoot);

	std::cout<<std::endl<<"back oreder result :";
	back_show(pRoot);
	
	std::cout<<std::endl<<"back oreder result——ex :";
	back_show_ex(pRoot);
	
	std::cout<<std::endl;
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值