二叉树的特点
- 每个结点最多只有两棵子树,不存在度数大于2的节点
- 二叉树是有序的,其次序不能任意颠倒
斜树
- 所有节点都只有左子树的称为左斜树;-
所有节点都只有右子树的称为右斜树;
-
在斜树中,每一层只有一个结点 , 斜树的结点个数==深度
满二叉树
- 在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有**叶子都在同一层上**,这样的二叉树被称为满二叉树。完全二叉树
- 对于具有n个节点的二叉树按层序编号,如果编号为i的节点与同样深度的满二叉树的编号为i的结点在二叉树中的位置相同,则这棵树是完全二叉树
- 叶子结点只能出现在最下面的两层,且最下层的叶子结点都集中在二叉树的左侧。
- 如果有度数为1的结点,只可能有一个,且该结点只有左孩子。
二叉树的五条基本性质
-
二叉树的第i层上最多有 2i-1 个结点
-
一棵深度为k的二叉树中,最多有2k-1个结点(完全二叉树),最少有k个(斜树)
-
在一棵二叉树中,如果叶子结点的个数为n0,度数为2的结点的个数为n2,则n0 = n2 + 1。
-
具有n个结点的完全二叉树的深度为log2 n+1(取最小整数)。
二叉树的建立
struct Node {
Node* lchild;
Node* rchild;
char value;
};
Node* createBinaryTree(Node* node){
char ch;
cin >> ch;
if (ch == '#')
node = NULL;
else {
node = new Node;
node->value = ch;
node->lchild = createBinaryTree(node->lchild);
node->rchild = createBinaryTree(node->rchild);
}
return node;
}
前序,后序,中序,层序遍历
void preOrder(Node* node) {
if (node != NULL) {
cout << node->value << " ";
preOrder(node->lchild);
preOrder(node->rchild);
}
}
void postOrder(Node* node) {
if (node != NULL) {
postOrder(node->lchild);
postOrder(node->rchild);
cout << node->value << " ";
}
}
void inOrder(Node* node) {
if (node != NULL) {
inOrder(node->lchild);
cout << node->value << " ";
inOrder(node->rchild);
}
}
void leverOrder(Node* node) {
if (node != NULL)
{
int front = -1, rear = -1;
Node* Q[10];
Q[++rear] = node;//入队
while (rear != front) {
Node* n = Q[++front];//出队
cout << n->value;
if (n->lchild != NULL) Q[++rear] = n->lchild;//不为空,则入队
if (n->rchild != NULL) Q[++rear] = n->rchild;
}
}
}
销毁
void deleteBinaryTree(Node*node) {
if (node != NULL)
{
deleteBinaryTree(node->lchild);
deleteBinaryTree(node->rchild);
delete(node);
}
}
哈弗曼树,树与森林之间的相互转换都是树中很重要的内容。