BTree

typedef struct node {
	ElemType data;
	struct node* lchild;
	struct node* rchild;
}BTNode;

  创建

void CreateBTree(BTNode*& b, char* str)
{
	BTNode* st[MAXSIZE], * p = NULL;
	b = NULL;
	int top = -1;
	int j = 0, i = 0;
	char ch = str[j];
	while (ch != '\0')
	{
		switch (ch)
		{
		case'(':
			top++; 
			st[top] = p;
			i = 1;
			break;
		case')':
			top--;
			break;
		case',':
			i = 2;
			break;
		default:
			p = (BTNode*)malloc(sizeof(BTNode));
			p->data = ch;
			p->lchild = p->rchild = NULL;
			
			if (b == NULL)
				b = p;
			else
			{
				switch (i)
				{
				case 1:
					st[top]->lchild = p; break;
				case 2:
					st[top]->rchild = p; break;
				}
			}
		}
		j++;
		ch = str[j];
	}
}

  销毁

void DestroyBTree(BTNode*& b)
{
	if (b != NULL)
	{
		DestroyBTree(b->rchild);
		DestroyBTree(b->rchild);
		free(b);
	}
}

  查找结点

BTNode* FindNode(BTNode* b, ElemType x)
{
	if (b == NULL)
		return NULL;
	else if (b->data == x)
		return b;
	else
	{
		if (FindNode(b->lchild, x) != NULL)
			return FindNode(b->lchild, x);
		else
			return FindNode(b->rchild, x);
	}
}

  求树高

int BTHeight(BTNode* b)
{
	int lchild, rchild;
	if (b == NULL)
		return 0;
	else
	{
		lchild = BTHeight(b->lchild);
		rchild = BTHeight(b->rchild);

		return lchild > rchild ? (lchild + 1) : (rchild + 1);
	}
}

  输出

void DispBTree(BTNode* b)
{
	if (b != NULL)
	{
		printf("%c", b->data);
		if (b->lchild != NULL || b->rchild != NULL)
		{
			printf("(");
			DispBTree(b->lchild);
			if (b->rchild != NULL)
				printf(",");
			DispBTree(b->rchild);
			printf(")");

		}
	}
}

  前序遍历

void PreOrder(BTNode* b)
{
	if (b != NULL)
	{
		printf("%c", b->data);
		PreOrder(b->lchild);
		PreOrder(b->rchild);

	}
}

  中序遍历

void InOrder(BTNode* b)
{
	if (b != NULL)
	{
		InOrder(b->lchild);
		printf("%c", b->data);
		InOrder(b->rchild);
	}
}

  后序遍历

void PostOrder(BTNode* b)
{
	if (b != NULL)
	{
		PostOrder(b->lchild);
		PostOrder(b->rchild);
		printf("%c", b->data);
	}
}

  求结点数

int Nodes(BTNode* b)
{
	if (b == NULL)
		return 0;
	else
		return(Nodes(b->lchild) + Nodes(b->rchild) + 1);
}

  输出所有叶子结点

void DispLeaf(BTNode* b)
{
	if (b != NULL)
	{
		if (b->lchild == NULL && b->rchild == NULL)
			printf("%c", b->data);
		DispLeaf(b->lchild);
		DispLeaf(b->rchild);
	}
}

  

猜你喜欢

转载自www.cnblogs.com/KIROsola/p/11432096.html