在树中将数据元素称为结点。
某结点所拥有的子树的个数成为该结点的度。
树中各结点度的最大值称为该树的度。
度为0的结点称为叶子结点,也称为终端结点,度不为0的结点称为分支结点,也称为非终端结点。
某结点的子树的根结点称为该结点的孩子结点,反之,该结点称为其孩子结点的双亲结点。
具有同一个双亲的孩子结点互称为兄弟结点。
如果从结点x到结点y有一条路径,那么x就称为y的祖先,y称为x的子孙。
规定根结点的层数为1,对其余任何结点,若某结点在第k层,则其孩子结点在第k+1层。
树中所有结点的最大层数称为书的深度,也称为树的高度。
树中每一层结点个数的最大值称为树的宽度。
二叉树:是n个结点的有限集合,该集合为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
二叉树的特点:每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。
二叉树的左右子树不能任意颠倒,如果某结点只有一棵子树,要指明是左子树还是右子树。
左斜树:所有结点都只有左子树的二叉树。
右斜树:所有结点都只有右子树的二叉树。
满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。
满二叉树特点:叶子只能出现在最下面一层。只有度为0和2的结点。
完全二叉树特点:深度为k的完全二叉树在k-1层是满二叉树。叶子结点只能出现在最下两层,而且最下层的叶子结点都集中在左侧连续的位置。如果有度为1的结点,只可能有一个,且该结点只有左孩子。
二叉树的性质
在一颗二叉树中,如果有n0个叶子,度为2的结点个数为n2,那么n0=n2+1。
二叉树的第i层上最多有2的i-1次方个结点。
在一棵深度为i的二叉树中,做多有(2的k次方)-1个结点。
具有n个结点的完全二叉树的深度为log2n+1。
二叉树的存储和遍历
前序遍历
先访问根结点
访问左子树
访问右子树
void PreOrder(BiNode* bt) {
if (bt == NULL)return;
else {
cout << bt->data << endl;
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
中序遍历
访问左子树
访问根结点
访问右子树
void InOrder(BiNode* bt) {
if (bt == NULL)return;
else {
PreOrder(bt->lchild);
cout << bt->data << endl;
PreOrder(bt->rchild);
}
}
后序遍历
访问左子树
访问右子树
访问根结点
void PostOrder(BiNode* bt) {
if (bt == NULL)return;
else {
PreOrder(bt->lchild);
PreOrder(bt->rchild);
cout << bt->data << endl;
}
}
全部代码:
#include<bits/stdc++.h>
using namespace std;
struct BiNode {
int data;
BiNode* lchild, * rchild;
};
void PreOrder(BiNode* bt) {
if (bt == NULL)return;
else {
cout << bt->data << endl;
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
void InOrder(BiNode* bt) {
if (bt == NULL)return;
else {
PreOrder(bt->lchild);
cout << bt->data << endl;
PreOrder(bt->rchild);
}
}
void PostOrder(BiNode* bt) {
if (bt == NULL)return;
else {
PreOrder(bt->lchild);
PreOrder(bt->rchild);
cout << bt->data << endl;
}
}
BiNode* Create() {
BiNode* bt;
char ch;
cin >> ch;
if (ch == '#')bt == NULL;
else {
bt = new BiNode; bt->data = ch;
bt->lchild = Create();
bt->rchild = Create();
}
return bt;
}
int main() {
return 0;
}