
一、什么是二叉树?
树有很多种,二叉树,三叉树之类的,二叉树就是只有左右两个分支(孩子)的树。而二叉树又分为满二叉树和完全二叉树。
1 满二叉树
除最后一层外,每一棵树都有左右两个非空孩子。如下:


3 二叉树的相关性质
(
1
)在二叉树的第
i
层至多有
2
i
−
1
个结点,深度为
k
的二叉树至多有
2
k
−
1
个结点
(1)在二叉树的第 i 层至多有 2 ^{i − 1}个结点,深度为k的二叉树至多有2^k-1个结点
(1)在二叉树的第i层至多有2i−1个结点,深度为k的二叉树至多有2k−1个结点
(
2
)对任何一棵二叉树,如果其叶子结点数为
n
0
,
度为二的结点数为
n
2
,
则
n
0
=
n
2
+
1
,
又总结点数
n
=
n
0
+
n
1
+
n
2
,
因此
n
=
n
1
+
2
n
2
+
1
(2) 对任何一棵二叉树,如果其叶子结点数为n_0,度为二的结点数为n_2,则n_0=n_2+1,又总结点数n=n_0+n_1+n_2,因此n=n_1+2n_2+1
(2)对任何一棵二叉树,如果其叶子结点数为n0,度为二的结点数为n2,则n0=n2+1,又总结点数n=n0+n1+n2,因此n=n1+2n2+1
(
3
)若二叉树结点数为
n
,则其高度为
[
l
o
g
n
]
+
1
,
设高度为
k
层,则
2
k
−
1
−
1
+
1
<
n
<
2
k
−
1
,
所以
k
<
=
[
l
o
g
n
]
+
1
(3)若二叉树结点数为n,则其高度为[logn]+1,设高度为k层,则2^{k-1}-1+1<n<2^k-1,所以k<=[logn]+1
(3)若二叉树结点数为n,则其高度为[logn]+1,设高度为k层,则2k−1−1+1<n<2k−1,所以k<=[logn]+1
二、创建和遍历二叉树
这里我们手动构建一个二叉树,二叉树需要左右孩子两个指针,数的本质是递归的,定义这样一个结构体,便能访问到所有结点。
1 DFS遍历
二叉树的遍历有前、中、后序三种,前序:根->左->右,中序:左->根->右 ,后序:左->右->根
typedef struct BinaryTreeNode
{
BTDataType data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{
BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
assert(newnode);
newnode->data = x;
newnode->left = NULL;
newnode->right = NULL;
return newnode;
}
BTNode* CreatTree()
{
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
BTNode* node6 = BuyNode(6);
BTNode* node7 = BuyNode(7);
BTNode* node8 = BuyNode(8);
node1->left = node2;
node1->right = node3;
node2->left = node4;
node2->right = node5;
node3->left = node6;
node3->right = node7;
node4->left = node8;
return node1;
}
void PreOrder(BTNode* root)
{
if (root == NULL)
return;
printf("%d ", root->data);
PreOrder(root->left);
PreOrder(root->right);
}
void InOrder(BTNode* root)
{
if (root == NULL)
return;
InOrder(root->left);
printf("%d ", root->data);
InOrder(root->right);
}
void PostOrder(BTNode* root)
{
if (root == NULL)
return;
PostOrder(root->left);
PostOrder(root->right);
printf("%d ", root->data);
}
2 BFS 层序遍历
层序遍历要求我们输入一个字符串,为了控制结束标志,这里我们用字符’#'表示结点值为NULL。
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
TreeNode* CreatTree(char* a, int* pi) {
if (a[*pi] != '#') {
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = a[*pi];
(*pi)++;
root->left = CreatTree(a, pi);
root->right = CreatTree(a, pi);
return root;
}
else {
(*pi)++;
return NULL;
}
}
void inOrder(TreeNode* root) {
if (root == NULL)
return;
inOrder(root->left);
printf("%c ", root->val);
inOrder(root->right);
}
int main() {
char a[100];
scanf("%s", a);
int i = 0;
TreeNode* root = CreatTree(a, &i);
inOrder(root);
return 0;
}
三 总结
这些都是二叉树的基础知识,下一篇会运用到一些二叉树的相关性质并且附上相关OJ。