目录
链式存储:
简介:
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程学到高阶数据结构如红黑树等会用到三叉链。
二叉树链式存储的模拟实现:
节点的定义:
typedef int HeapDataType;
typedef struct Bintreenode
{
HeapDataType a;
struct Bintreenode * left;
struct Bintreenode * right;
}BN;
链式二叉树的创建:
前序构建:
BN * GreateTree(int *a,int *pi)
{
if(a[*pi]=='#')
{
(*pi)++;
return;
}
BN * root = (BN*)malloc(sizeof(BN));
root->val = a[(*pi)++];
root->left = GreataTree(a,pi);
root->right = GreateTree(a,pi);
return root;
}
中序构建:
BN * GreateTree(int *a,int *pi)
{
if(a[*pi]=='#')
{
(*pi)++;
return;
}
BN * root = (BN*)malloc(sizeof(BN));
root->left = GreataTree(a,pi);
root->val = a[(*pi)++];
root->right = GreateTree(a,pi);
return root;
}
后续构建:
BN * GreateTree(int *a,int *pi)
{
if(a[*pi]=='#')
{
(*pi)++;
return;
}
BN * root = (BN*)malloc(sizeof(BN));
root->left = GreataTree(a,pi);
root->right = GreateTree(a,pi);
root->val = a[(*pi)++];
return root;
}
链式二叉树的销毁:
void TreeDestory(BN * n)
{
if(n == NULL)
return;
TreeDestory(n->left);
TreeDestory(n->right);
free(n);
}
链式二叉树求节点个数:
int TreeNoteNumber(BN * n)
{
if(n == NULL)
{
return 0;
}
return (TreeNoteNumber(n->left) + TreeNoteNumber(n->right) + 1);
}
链式二叉数求高度:
int TreeHeight(BN * n)
{
if(n == NULL)
{
return 0;
}
int leftheight = TreeHeight(n->left) + 1;
int rightheight = TreeHeight(n->right) + 1;
return leftheight > rightheight ? leftheight : rightheight;
}
链式二叉树的遍历:
前序遍历:
二叉树的前序遍历是一种深度优先遍历策略,它按照“根节点-左子树-右子树”的顺序进行遍历。在前序遍历中,我们首先访问根节点,然后递归地进行左子树的前序遍历,最后进行右子树的前序遍历。
void PreOrder(BN* n)
{
if (n == NULL)
{
printf("N ");
return;
}
printf("%d ", n->data);
PreOrder(n->left);
PreOrder(n->right);
}
中序遍历:
二叉树的中序遍历是一种深度优先遍历策略,它按照“左子树-根节点-右子树”的顺序进行遍历。在中序遍历中,我们首先递归地进行左子树的中序遍历,然后访问根节点,最后递归地进行右子树的中序遍历。
void InOrder(BN* n)
{
if (n == NULL)
{
printf("N ");
return;
}
InOrder(n->left);
printf("%d ", n->data);
InOrder(n->right);
}
后续遍历:
二叉树的后序遍历是一种深度优先遍历策略,它按照“左子树-右子树-根节点”的顺序进行遍历。在后序遍历中,我们首先递归地进行左子树的后序遍历,然后递归地进行右子树的后序遍历,最后访问根节点。
void PostOrder(BN* n)
{
if (n == NULL)
{
printf("N ");
return;
}
PostOrder(n->left);
PostOrder(n->right);
printf("%d ", n->data);
}