二叉树的基本操作

本文就二叉树的基本操作进行总结

包括二叉树的建立、递归遍历、非递归遍历、层序遍历等

二叉树的结构体如下

typedef struct _node
{
	char data;
	struct _node* lchild;
	struct _node* rchild;
}node;

1.二叉树的建立

void create(node*& tree)
{
	char data;
	scanf("%c",&data);
	if ('#'==data)
	{
		tree=NULL;
		return;
	}
	tree=(node*)malloc(sizeof(node));
	tree->data=data;
	printf("输入%c的左节点:",data);
	create(tree->lchild);
	printf("输入%c的右节点:",data);
	create(tree->rchild);
}

2.递归遍历

void preOrder(node* tree)  //先序递归遍历
{
	if(tree)
	{
		printf("%c",tree->data);
		preOrder(tree->lchild);
		preOrder(tree->rchild);
	}
}

void inOrder(node* tree)  //中序递归遍历
{
	if(tree)
	{
		inOrder(tree->lchild);
		printf("%c",tree->data);
		inOrder(tree->rchild);
	}
}

void postOrder(node* tree) //后序递归遍历
{
	if(tree)
	{
		postOrder(tree->lchild);
		postOrder(tree->rchild);
		printf("%c",tree->data);
	}
}

3.非递归遍历

非递归遍历利用队列实现

void preOrder1(node* tree)   //先序非递归遍历
{
	deque<node*> q;
	node* t=tree;
	while (t!=NULL||!q.empty()) 
	{
		while (t!=NULL) 
		{
			printf("%c",t->data);
			q.push_back(t);
			t=t->lchild;
		}
		t=q.back();
		q.pop_back();
		t=t->rchild;
	}
}

void inOrder1(node* tree)  //中序非递归遍历
{
	deque<node*> q;
	node* t=tree;
	while (t!=NULL||!q.empty()) 
	{
		while (t!=NULL) 
		{
			q.push_back(t);
			t=t->lchild;
		}
		t=q.back();
		q.pop_back();
		printf("%c",t->data);
		t=t->rchild;	
	}
}

void postOrder1(node* tree)  //后序非递归遍历
{
	deque<node*> q;
	node* t=tree;
	node* prerchild=NULL;
	while (t!=NULL||!q.empty()) 
	{
		while (t!=NULL) 
		{
			q.push_back(t);
			t=t->lchild;
		}
		t=q.back();
		if (t->rchild==NULL||t->rchild==prerchild) 
		{
			q.pop_back();
			printf("%c",t->data);
			prerchild=t;
			t=NULL;
		}
		else
		{
			t=t->rchild;
		}
	}
}

4.层序遍历

层序遍历也是借助队列实现的

void levelOrder(node* tree)
{
	deque <node*> q;
	if (!tree) return;
	node* t=tree;
	q.push_back(t);
	while (!q.empty()) 
	{
		t=q.front();
		q.pop_front();
		printf("%c",t->data);
		if (t->lchild) q.push_back(t->lchild);
		if (t->rchild) q.push_back(t->rchild);
	}
}

层序遍历有时候,还需要将不同层之间分层输出,实现如下

void levelOrder1(node* tree)
{
	deque<node*> q;
	if (NULL==tree) return; 
	node* t=tree;
	q.push_back(t);
	int levelNum=1;
	while(!q.empty())
	{
		levelNum=q.size();
		for (int i=0;i<levelNum;i++) 
		{
			t=q.front();
			q.pop_front();
			printf("%c",t->data);
			if (t->lchild!=NULL) 
			{
				q.push_back(t->lchild);			
			}
			if (t->rchild!=NULL) 
			{
				q.push_back(t->rchild);
			}
		}
		printf("\n");
	}
}


你可能感兴趣的:(二叉树的基本操作)