一、树的概念
树是一种非线性结构,由n个结点组成的具有层次关系的结合,有一个特殊的结点为根结点,在树中,子树之间不能有交集。
树的相关概念:
结点的度
:一个结点含有的子树的个数称为该结点的度;
叶结点
:度为
0
的结点称为叶结点;
父结点
:若一个结点含有子结点,则这个结点称为其子结点的父结点;
孩子结点
:一个结点含有的子树的根结点称为该结点的子结点;
兄弟结点
:具有相同父结点的结点互称为兄弟结点;
树的度
:一棵树中,最大的结点的度称为树的度;
结点的层次
:从根开始定义起,根为第
1
层,根的子结点为第
2
层,以此类推;
树的高度或深度
:树中结点的最大层次;
结点的祖先
:从根到该结点所经分支上的所有结点;
子孙
:以某结点为根的子树中任一结点都称为该结点的子孙。
二、二叉树
二叉树一般可以由两种结构存储:链式结构和顺序结构
顺序结构:使用数组来存储,一般完全二叉树更适合使用数组存储,因为不是完全二叉树会造成空间的浪费。
链式结构:链式结构表示用链表来存储一棵二叉树,即用链来表示元素的逻辑关系
一个二叉树结点由根节点和指向左孩子的指针和指向右孩子的指针构成:
typedef struct tree
{
int val;
struct tree*left;
struct tree*right;
}Tree;
二叉树的遍历:
前序遍历:访问根节点发生在访问左右子树之前
中序遍历:访问根结点发生在访问左右子树之间
后序遍历:访问根结点发生在访问左右子树之后
层序遍历:按照二叉树的层数访问每层的结点。
这里仅以前序和中序举例:
给出一段前序遍历形成的字符串,根据此字符串建立起二叉树,再对该树进行中序遍历:
#include <stdio.h>
#include<stdlib.h>
typedef struct treenode
{
char val;
struct treenode*left;
struct treenode*right;
}TN;
TN*createtree(char*arr,int*pi)
{
if(arr[*pi]=='#')
{ (*pi)++;
return NULL;
}
TN*node=(TN*)malloc(sizeof(TN));
node->val=arr[(*pi)++];
node->left=createtree(arr,pi);
node->right=createtree(arr,pi);
return node;
}
void inorder(TN*root)
{
if(root==NULL)
return ;
inorder(root->left);
printf("%c ",root->val);
inorder(root->right);
}
int main() {
char arr[100];
int i=0;
scanf("%s",arr);
TN*root=createtree(arr,&i);
inorder(root);
return 0;
}