二叉树构建和三种遍历算法实现等【数据结构-朱战立】

版权声明:访问者可将本博客提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。除此以外,将本网站任何内容或服务用于其他用途时,须征得本博客及相关权利人的书面许可,并支付报酬。 https://blog.csdn.net/qq894040717/article/details/81842009
/*2018年8月19日 16:55:56*/
/*构建一个二叉树函数*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef char DataType;
typedef struct tree{

	DataType data;
	struct tree *left;
	struct tree *right;
}TreeNode;


/*二叉树初始化函数*/
void TreeInit(TreeNode **root)
{
	if ((*root=(TreeNode *)malloc(sizeof(TreeNode)))==NULL)
	{
		printf("-error-");
		getchar();
		exit(1);
	}
	(*root)->left = NULL;
	(*root)->right = NULL;
}

/*二叉树左子节点插入*/
int *TreeLeftNode(TreeNode *pLeft, DataType x)
{
	TreeNode *pre, *temp;

	if (pLeft==NULL)
	{
		return NULL;
	}

	temp = pLeft->left;  //保存原节点的左子树指针
	pre = (TreeNode*)malloc(sizeof(TreeNode));//开辟pre的内存空间
	pre->data = x;      //将数字插入节点数据储存中
	pre->left = temp;//将原树的左子树指针赋值给新节点的左子树指针
	pre->right = NULL; //将新节点右子树设为空;

	pLeft->left = pre; //新节点成为左子树;
	return pLeft->left;  //2018年8月19日 21:03:12  返回左子树指针
}


/*二叉树右子节点插入*/
int *TreeRightNode(TreeNode *pRight, DataType x)
{
	TreeNode *pre, *temp;

	if (pRight == NULL)
	{
		return NULL;
	}

	temp = pRight->right;
	pre = (TreeNode*)malloc(sizeof(TreeNode));//开辟pre的内存空间
	pre->data = x;
	pre->right = temp;

	pre->left = NULL;
	pRight->right = pre;
	return pRight->right;   //2018年8月19日 21:02:49  返回右子树指针
}


/*二叉树左子节点删除*/
int *TreeLeftDel(TreeNode *dLeft)
{
	if (dLeft==NULL||dLeft->left==NULL)
	{
		return NULL;
	}
	free(dLeft->left);
	dLeft->left = NULL;
	return dLeft;
}

/*二叉树右子节点删除*/
int *TreeRightDel(TreeNode *dright)
{
	if (dright==NULL||dright->right==NULL)
	{
		return NULL;
	}
	free(dright->right);
	dright->right = NULL;
	return dright;
}


/*递归撤销链表的函数*/
void Destroy(TreeNode **tree)
{
	if ((*tree) != NULL && (*tree)->left != NULL)
	{
		Destroy(&(*tree)->left);
	}
	if ((*tree) != NULL && (*tree)->right != NULL)
	{
		Destroy(&(*tree)->right);
	}
	free(*tree);
}

/*通过递归实现遍历*/
void Visit(DataType item)
{
	printf("%c->",item);
}

/*前序遍历*/
void FrontOrder(TreeNode *tree, void Visit(DataType item))
{
	if (tree!=NULL)
	{
		Visit(tree->data);
		FrontOrder(tree->left, Visit);
		FrontOrder(tree->right, Visit);
	}
}

/*中序遍历*/
void BetweenOrder(TreeNode *tree, void Visit(DataType item))
{
	if (tree!=NULL)
	{
		BetweenOrder(tree->left, Visit);
		Visit(tree->data);
		BetweenOrder(tree->right, Visit);
	}
}

/*后续遍历*/
void LastOrder(TreeNode *tree, void Visit(DataType item))
{
	if (tree != NULL)
	{
		BetweenOrder(tree->left, Visit);
		BetweenOrder(tree->right, Visit);
		Visit(tree->data);
	}
}

/*打印函数*/
void PrintBiTree(TreeNode *tree, int num) //其中num是层数
{
	int i;
	if (tree==NULL)
	{
		return;
	}
	PrintBiTree(tree->right, num + 1);
	/*访问根节点*/
	for ( i = 0; i < num-1; i++)
	{
		printf("   ");
	}
	if (num>0)
	{
		printf("----");
		printf("%c\n", tree->data);
	}
	PrintBiTree(tree->left, num + 1);
}

/*二叉树查找函数*/
TreeNode *Serach(TreeNode *tree, DataType x)
{
	TreeNode *pre;

	if (tree==NULL)
	{
		return NULL;
	}
	if (tree->data==x)
	{
		return tree;
	}
	if (tree->left!=NULL)
	{
		pre=Serach(tree->left, x);
		if (pre!=NULL)
		{
			return pre;
		}
	}
	if (tree->right != NULL)
	{
		pre=Serach(tree->right, x);
		if (pre != NULL)
		{
			return pre;
		}
	}
	return NULL;
}

/*主函数*/

int main()
{
	TreeNode *root,*p,*pp;

	TreeInit(&root);
	p = TreeLeftNode(root, 'A');
	p = TreeLeftNode(p, 'B');
	p = TreeLeftNode(p, 'D');
	p = TreeRightNode(p, 'G');
	p = TreeRightNode(root->left, 'C');
	pp = p;
	TreeLeftNode(p, 'E');
	TreeRightNode(pp, 'F');

	PrintBiTree(root, 0);

	printf("前序遍历:\n");
	FrontOrder(root->left, Visit);
	printf("\n中序遍历:\n");
	BetweenOrder(root->left, Visit);
	printf("\n后序遍历:\n");
	LastOrder(root->left, Visit);

	Destroy(&root);  //2018年8月19日 20:40:34 注意这里输出型
	printf("\n");
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq894040717/article/details/81842009