数据结构之树结构的实现--二叉树链式结构(C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40411915/article/details/82808227

学习参考: 严蔚敏: 《数据结构-C语言版》

基本操作

  1. 创建二叉树
  2. 先序遍历(递归)
  3. 中序遍历(递归)
  4. 后序遍历(递归)
  5. 层次遍历
  6. 先序遍历(非递归)
  7. 中序遍历(非递归)
  8. 后序遍历(非递归)
  9. 查询
  10. 改进版查询
  11. 求树的深度
  12. 求叶子结点
  13. 求结点数
  14. 销魂二叉树

代码实现

二叉树结构定义

typedef struct node
{
	char data;
	struct node *lchild, *rchild;
}BiTNode,* BiTree;

创建二叉树

BiTree CreateBiTree(BiTree t)
{
	char ch;
	scanf("%c", &ch);
	if (ch == '#')
		t = NULL;
	else
	{
		t = (BiTree)malloc(sizeof(BiTNode));
		t->data = ch;
		CreateBiTree(t->lchild);
		CreateBiTree(t->rchild);
	}
	return t;
}

先序遍历(递归)

int preOrderTraverse(BiTree t)
{
	if (!t)
		return 0;
	printf("%c", t->data);
	preOrderTraverse(t->lchild);
	preOrderTraverse(t->rchild);
	return 1;
}

中序遍历(递归)

int inOrderTraverse(BiTree t)
{
	if (!t)
		return 0;
	inOrderTraverse(t->lchild);
	printf("%c", t->data);
	inOrderTraverse(t->rchild);
	return 1;
}

后序遍历(递归)

int postOrderTraverse(BiTree t)
{
	if (!t)
		return 0;
	inOrderTraverse(t->lchild);
	inOrderTraverse(t->rchild);
	printf("%c", t->data);
	return 1;
}

层次遍历

int levelTraverse(BiTree t)
{
	BiTree Tqueue[100];
	BiTNode* p = NULL;
	int front, rear;
	front = rear = 0;
	if (t)
	{
		rear = (rear + 1) % 100;
		Tqueue[rear] = t;
		while (rear != front)
		{
			front = (front + 1) % 100;
			p = Tqueue[front];
			printf("%c", p->data);
			if (p->lchild)
			{
				rear = (rear + 1) % 100;
				Tqueue[rear] = p->lchild;
			}
			if (p->rchild)
			{
				rear = (rear + 1) % 100;
				Tqueue[rear] = p->rchild;
			}
		}
	}
	return 1;
}

先序遍历(非递归)

int preOrderTraverseEx(BiTree t)
{
	BiTree arr[100];
	BiTNode* temp = NULL;
	int len = 0;
	if (t)
	{
		arr[len] = t;
		len++;
		while (len != 0)
		{
			temp = arr[len - 1];
			while (temp)
			{
				printf("%c\n", temp->data);
				arr[len] = temp->lchild;
				len++;
				temp = arr[len - 1];
			}
			temp = arr[len - 1];
			len--;
			if (len != 0)
			{
				temp = arr[len - 1];
				len--;
				arr[len] = temp->rchild;
				len++;
			}
		}
		return 1;
	}
	return 0;
}

中序遍历(非递归)

int inOrderTraverseEx(BiTree t)
{
	BiTree arr[100];
	BiTNode* temp = NULL;
	int len = 0;
	if (t)
	{
		arr[len] = t;
		len++;
		while (len!=0)
		{
			temp = arr[len - 1];
			while (temp)
			{
				arr[len] = temp->lchild;
				len++;
				temp = arr[len - 1];
			}
			temp = arr[len - 1];
			len--;
			if (len!=0)
			{
				temp = arr[len - 1];
				len--;
				printf("%c\n", temp->data);
				arr[len] = temp->rchild;
				len++;
			}
		}
		return 1;
	}
	return 0;
}

后序遍历(非递归)

int postOrderTraverseEx(BiTree t)
{
	BiTree arr[100];
	BiTNode* pre = NULL,* temp = t;
	int len = 0;
	if (temp)
	{
		while (temp || !(len == 0))
		{
			while (temp)
			{
				arr[len] = temp;
				len++;
				temp = temp->lchild;
			}
			if (!(len == 0))
			{
				temp = arr[len - 1];
				if (temp->rchild != NULL && temp->rchild != pre) // 右节点存在且没有被访问过
				{
					arr[len] = temp;
					temp = temp->rchild;
				}
				else
				{
					printf("%c\n", temp->data);
					pre = temp;
					temp = NULL;
				}
			}
		}
		return 1;
	}
	return 0;
}

查询

int search(BiTree t, BiTNode* q, int key)
{
	BiTree p = t;
	if (p != NULL)
	{
		if (p->data == key)
			q = p;
		else
		{
			search(p->lchild, q, key);
			search(p->lchild, q, key);
		}
		return 1;
	}
	return 0;
}

改进版查询

int search(BiTree p, BiTNode* q, int key)
{
	if (p)
	{
		if (p->data == key)
			q = p;
		else
		{
			search(p->lchild, q, key);
			if (q == NULL)
				search(p->rchild, q, key);
		}
		return 1;
	}
	return 0;
}

求树的深度

int getTreeDepth(BiTree t)
{
	int lchildHeight, rchildHeight;
	if (t == NULL)
		return 0;
	lchildHeight = getTreeHeight(t->lchild);
	rchildHeight = getTreeHeight(t->rchild);
	return (lchildHeight > rchildHeight) ? (1 + lchildHeight) : (1 + rchildHeight);
}

求叶子结点

int getTreeAllLeafNodeCount(BiTree t)
{
	if (t == NULL)
		return 0;
	if (t->lchild == NULL && t->rchild == NULL)
		return 1;
	else
	{
		return getTreeAllNodeCount(t->lchild) + getTreeAllLeafNodeCount(t->rchild);
	}
}

求结点数

int getTreeAllNodeCount(BiTree t)
{
	if (t == NULL)
		return 0;
	return getTreeAllNodeCount(t->lchild) + getTreeAllNodeCount(t->rchild);
}

销毁二叉树

int destroyTree(BiTree t)
{
	BiTNode* p = NULL,* pr = NULL;
	if (t == NULL)
		return 0;
	p = t->lchild;
	pr = t->rchild;
	t->lchild = NULL;
	t->rchild = NULL;
	free(t);
	t = NULL;
	destroyTree(p);
	destroyTree(pr);
	return 1;
}

写在最后

文章记录本人学习所得, 如有所错误, 欢迎留言指出交流, 大神请键盘下留人 ! ! ! 

猜你喜欢

转载自blog.csdn.net/weixin_40411915/article/details/82808227