二叉樹的前序、中序、後序的實現(遞歸和非遞歸)

二叉樹的前序遍歷,中序遍歷,後序遍歷,層序遍歷一直是筆試面試中常考的內容,這次自己都把實現了

寫了一兩個小時,算是總結過了,以後用的時候拿出來,如果寫的不好的,希望大家指出來

#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;
}

以後遇到一些其他的問題再加上去
發佈了39 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章