二叉树的创建与遍历

                  

                 二叉树的创建与遍历是比较基本的问题,也是比较难的问题,在c语言中需要对指针和链表的操作比较熟悉,还要对递归有比较好的理解,下面用代码展示,在代码中有比较详细的注释。下面就贴出代码:

          

/*
	关于非线性的数据结构当然树形结构最重要,而树里面又属二叉树最重要,
	所以在后面将列出二叉树的各种使用方法,包括基本的遍历,和我在一些
	资料上看到的关于二叉树的面试题型。至于一些很高级的树形结构,如平
	衡树,还有线索树等,就暂时不写出来,先完成最基本的,再一点点的加
*/

#include <stdio.h>
#include <stdlib.h>
//typedef void * ElemType;
typedef int ElemType;

struct BinaryTree
{
	ElemType e;
	BinaryTree *left;
	BinaryTree *right;
};

/*
	二叉树主要的难点是遍历
	基本上所有的算法都是基于二叉树的遍历的
	至于创建二叉树就需要在输入的时候把线性的结构转换成非线性的
	用输入的方式创建二叉树,创建二叉树有三种方式,和二叉树的遍
	历是一样的,所以将采用三种方式创建二叉树,再用三种方式遍历
	二叉树,
*/

				//将输入独立起来,
BinaryTree * CreateTree(BinaryTree *bTree)
{
	int input;
	scanf("%d",&input);			//按先序建立二叉树
	if(input == 0)
	{
		bTree = NULL;	//置为NULL后结束
		return bTree;	
	}
	bTree = (BinaryTree *)malloc(sizeof(BinaryTree));
	bTree ->e = input;
	bTree->left = CreateTree(bTree->left);
	bTree->right = CreateTree(bTree->right);
	return bTree;
}

//三种递归遍历方法

void VisitTree(BinaryTree *bTree)		//这个是先序遍历,先根,左子树,右子树
{
	if(bTree != NULL)
	{
		printf("%d ",bTree->e);
		VisitTree(bTree->left);
		VisitTree(bTree->right);
	}
}

void VisitTree1(BinaryTree *bTree)		//中序遍历,左子树,根,右子树
{
	if(bTree != NULL)
	{
		VisitTree1(bTree->left);
		printf("%d ",bTree ->e);
		VisitTree1(bTree ->right);
	}
}

void VisitTree2(BinaryTree *bTree)		//后序遍历,左子树,右子树,根
{

	if(bTree != NULL)
	{
		VisitTree2(bTree->left);
		VisitTree2(bTree->right);
		printf("%d ",bTree ->e);
	}
}
int main()
{
	BinaryTree *bTree;

	bTree=CreateTree(bTree);
	printf("先序遍历结果为:\n");
	VisitTree(bTree);
	printf("\n");
	
	printf("中序遍历结果为:\n");
	VisitTree1(bTree);
	printf("\n");

	printf("后序序遍历结果为:\n");
	VisitTree2(bTree);
	printf("\n");

	return 0;
}


输入一下数据:2 3 4 0 0 5 0 6 0 0 7 0 0形成下面的二叉树:

    

 

最后采用三种不行形式遍历二叉树的结果为:


 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页