二叉树是一种特殊的树,二叉树是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;
来源:https://blog.csdn.net/qq_43735092/article/details/99288124