现在的位置: 首页 > 综合 > 正文

二叉树的前序、中序、后序的实现(递归和非递归)

2013年06月29日 ⁄ 综合 ⁄ 共 3655字 ⁄ 字号 评论关闭

二叉树的前序遍历,中序遍历,后序遍历,层序遍历一直是笔试面试中常考的内容,这次自己都把实现了

写了一两个小时,算是总结过了,以后用的时候拿出来,如果写的不好的,希望大家指出来

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
#include <stack>

using namespace std;

typedef struct BiTree_Node
{
	char data;
	struct BiTree_Node *left, *right;
}BiTree_Node;

void CreateBiTree(BiTree_Node **root)
{
	char x;
	scanf("\n%c",&x);
	if(x == '#')
		*root = NULL;
	else
	{
		*root = (BiTree_Node*)malloc(sizeof(BiTree_Node));
	 	if(*root == NULL)
			printf("malloc error\n");
		(*root)->data = x;
		printf("please input %c left child\n", x);
		CreateBiTree(&((*root)->left));
		printf("please input %c right child\n", x);
		CreateBiTree(&((*root)->right));
	}
}

/*先序遍历*/
void PreOrder(BiTree_Node *root)
{
	if(root == NULL)
		return ;
	printf("%c\n",root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}

/*中序遍历*/
void InOrder(BiTree_Node *root)
{
	if(root == NULL)
		return ;
	InOrder(root->left);
	printf("%c\n",root->data);
	InOrder(root->right);
}

/*后序遍历*/
void PostOrder(BiTree_Node *root)
{
	if(root == NULL)
		return ;
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%c\n",root->data);
}

/*节点个数*/
int Node_Num(BiTree_Node *root)
{
	if(root == NULL)
		return 0;
	else
		return 1 + Node_Num(root->left) + Node_Num(root->right);
}

/*树的深度*/
int depth(BiTree_Node *root)
{
	if(root == NULL)
		return 0;
	int	dl = depth(root->left);
	int dr = depth(root->right);
	return (dl>dr ? dl : dr) + 1;
}

/*先序遍历的非递归实现*/
void PreOrder_nocur(BiTree_Node *root)
{
	if(root == NULL)
		return;

	stack <BiTree_Node*> BiTstack;
	BiTree_Node *node = (BiTree_Node*)malloc(sizeof(BiTree_Node));
	BiTstack.push(root);

	while(!BiTstack.empty())
	{
		node = BiTstack.top();
		printf("%c\n",node->data);
		BiTstack.pop();

		if(node->right != NULL)
			BiTstack.push(node->right);
		if(node->left != NULL)
			BiTstack.push(node->left);
	}
	
}
/*中序遍历的非递归实现*/
void InOrder_nocur(BiTree_Node *root)
{
	if(root == NULL)
		return ;
	BiTree_Node *node = root;

	/*先把左孩子全部压入栈中*/
	stack<BiTree_Node*> BiTstack;
	while(node != NULL)
	{
		BiTstack.push(node);
		node = node->left;
	}	

	while(!BiTstack.empty())
	{
		node = BiTstack.top();
		printf("%c\n",node->data);
		BiTstack.pop();

		/*每一个孩子的右孩子如果存在,从它开始的左孩子开始入栈*/
		node = node->right;
		while(node != NULL)
		{
			BiTstack.push(node);
			node = node->left;
		}
	}
}


/*后序遍历的非递归实现------双栈法*/
void PostOrder_nocur(BiTree_Node *root)
{
	stack<BiTree_Node*> s1, s2;
	BiTree_Node *node = root;
	s1.push(node);

	while(!s1.empty())
	{
		node = s1.top();
		s1.pop();
		s2.push(node);

		if(node->right != NULL)
			s1.push(node->left);
		if(node->left != NULL)
			s1.push(node->right);
	}
	while(!s2.empty())
	{
		node = s2.top();
		s2.pop();
		printf("%c\n",node->data);
	}
}

/*层序遍历的实现*/
void level_travel(BiTree_Node *root)
{

	BiTree_Node *node;
	queue<BiTree_Node *> BiTQ;
	BiTQ.push(root);

	while(!BiTQ.empty())
	{
		node = BiTQ.front();
		BiTQ.pop();

		printf("%c\n",node->data);
		if(node->left != NULL)
			BiTQ.push(node);
		if(node->right != NULL)
			BiTQ.push(node);
	}

}


int main()
{
	BiTree_Node *root;

	int flag = 1;
	while(flag){
	printf("-----------------0.创建二叉树---------------------\n");
	printf("-----------------1.前序遍历-----------------------\n");
	printf("-----------------2.中序遍历-----------------------\n");
	printf("-----------------3.后序遍历-----------------------\n");
	printf("-----------------4.层序遍历-----------------------\n");
	printf("-----------------5.树的深度-----------------------\n");
	printf("-----------------6.节点个数-----------------------\n");
	printf("-----------------7.前序遍历非递归-----------------\n");
	printf("-----------------8.中序遍历非递归-----------------\n");
	printf("-----------------9.后序遍历非递归-----------------\n");

	int x, len, num;
	scanf("\n%d",&x);
	
	switch(x)
	{
		case 0:printf("please input the root\n"); CreateBiTree(&root);break;		case 1:PreOrder(root); break;
		case 2:InOrder(root); break;
		case 3:PostOrder(root);break;
		case 4:level_travel(root);break;
		case 5:len = depth(root);printf("depth:%d\n",len);break;
		case 6:num = Node_Num(root);printf("node num:%d\n",num);break;
		case 7:PreOrder_nocur(root);break;
		case 8:InOrder_nocur(root);break;
		case 9:PostOrder_nocur(root);break;
		default:flag = 0;break;
	}
	}

	return 0;
}

以后遇到一些其他的问题再加上去

抱歉!评论已关闭.