二叉树的创建与3种遍历详讲

大憨熊 提交于 2019-11-27 02:26:05

二叉树是一种特殊的树,二叉树是n(n>=0)个结点的有限集合,该集合或者为空集,或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成.
二叉树性质:

在二叉树的第i层最多有2^(i-1)个结点 (i>=1)
深度为k的二叉树至多有2^k -1 个结点 ( k>=1)
对任意一颗二叉树T,如果其终点结点数为n0,度为2的结点数为n2,则n0=n2+1;
如果一颗有n个结点的完全二叉树的结点按层序编号,对任一结点i(1<=i<=n)
有:
1.如果i=1,则结点i是二叉树的根,无双亲,如果i>1则其双亲是结点i/2向下取整
如果n<2i 则结点i无左孩子,否者其左孩子是结点2i
如果n<2i+1,则结点i无右孩子,否则其右孩子是结点2i+1.

下面是二叉树的定义代码


typedef struct TreeNode
{
	char data;
	struct TreeNode * lchild;
	struct TreeNode * rchild;

}TreeNode,*Tree;

二叉树的建立

void CreateTree(Tree * pte)
{
	char ch;
 	scanf("%c", &ch);
	if (ch == '#')
	{
		*pte = (TreeNode*)malloc(sizeof(TreeNode));
		if (!*pte)
			exit(1);
		(*pte)->data = ch;
	}
	else
	{
		*pte = (TreeNode*)malloc(sizeof(TreeNode));
		if (!*pte)
			exit(1);
		(*pte)->data = ch;
		CreateTree(&(*pte)->lchild);
		CreateTree(&(*pte)->rchild);

	}
}

前序遍历


void PreOrderReverse(Tree pte)
{
	if (pte->data == '#')
	{
		printf("%c", pte->data);
		return;
	}
	printf("%c", pte->data);
	PreOrderReverse(pte->lchild);
	PreOrderReverse(pte->rchild);

}

中序遍历

void InOrderReverse(Tree pte)
{
	if (pte->data == '#')
	{
		printf("%c", pte->data);
		return;
	}
	InOrderReverse(pte->lchild);
	printf("%c", pte->data);
	InOrderReverse(pte->rchild);
}

后续遍历

void PosOrderReverse(Tree pte)
{
	if (pte->data=='#')
	{
		printf("%c", pte->data);
		return;
	}
	PosOrderReverse(pte->lchild);
	PosOrderReverse(pte->rchild);
	printf("%c", pte->data);
}

主函数

int main()
{
	TreeNode T;
	Tree  pte = &T;
	CreateTree(&pte);
	InOrderReverse(pte);
	
	printf("\n");
	system("pause");
	return 0;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!