0 概念
1.二叉树(Binary Tree)是含有n个结点的有限集合,具有以下几个特点:
- 有且只有一个称(root)的节点
- 其余结点划分为两个互不相交的子集L和R,称为左子树和右子树
2.二叉树的一些基本概念有:
- 度:结点的孩子个数称为度,对于二叉树,度可为0,1,2
- 层次:从根结点开始定义,根结点为1,根的孩子为2,以此类推
- 深度:二叉树中最大层次称为二叉树的深
3.二叉树性质
4.完全二叉树与满二叉树
- 满二叉树:深度为k且结点数为`2^k-1`的二叉树
- 完全二叉树:深度为k,前k-1层为满二叉树,最后一层结点排列在左边。
1 二叉树实现
typedef struct btnode{
int val;
struct btnode *left;
struct btnode *right;
} btnode, *btree;
btree create(int val, btree lt, btree rt)
{
btree tree;
tree = (btree)malloc(sizeof(btnode));
if (tree == NULL) return NULL;
tree->val = val;
tree->left = lt;
tree->right = rt;
return tree;
}
void destroy(btree t)
{
if (t == NULL) return;
destroy(t->left);
destroy(t->right);
free(t);
t = NULL;
}
2 二叉树三种遍历
2.1 中序遍历
中序遍历即
LDR,先遍历左子树,再遍历根,最后遍历右子树。
/*中序遍历递归版*/
void ldr_rec(btree t, void (*visit)(int))
{
if (t == NULL) return;
ldr_rec(t->left, visit);
visit(t->val);
ldr_rec(t->right, visit);
}
/*中序遍历非递归版*/
void ldr_nor(btree t, void (*visit)(int)) //先把所有左结点入栈,然后访问结点,最后转右子树
{
if (t == NULL) return;
btree p = t;
std::stack<btnode*> s;
while(!s.empty() || p)
{
if (p