赞
踩
概念:
1.可以是空树
2.当不是空树时,由根节点+根节点的左子树+根节点的右子树组成(根节点的左右子树也是二叉树)
特点:
1.每个结点最多有两棵树
2.左右子树不能颠倒(必须是有序的)
结构(5种情况)
特殊二叉树-----满二叉树和完全二叉树(主要看图理解下)
满二叉树:每层都达到最大值,K层,每层的结点数都是2^(k-1) 满二叉数也是特殊的完全二叉树哦
完全二叉树:有右孩子必须有左孩子(下图2文字写反了)
分两种:顺序结构、链式结构
顺序存储:典型的就是堆(完全二叉树),就是使用数组来存储,一般只适合表示完全二叉树(不是完全二叉树会有空间浪费)所以二叉树的顺序存储在物理上是一个数组,在逻辑上是一颗二叉树
链式存储
就是用链表来表示一颗二叉树,通常的方法是孩子表示法(二叉链)和孩子双亲表示法(三叉链),这里主要讲二叉链,也就是孩子表示法,三叉链在红黑树部分再提(PS:二叉链和三叉链都是面试期间常考的)
链表中每个结点由三个域组成,数据域和左右指针域,左右指针域是左右孩子所在的链结点的存储地址,到这是不是就想到递归了,看图理解下
先创建结点:结点的左右子树都是结点
typedef int BTDataType;
typedef struct BinTreeNode
{
struct BinTreeNode* left;
struct BinTreeNode* right;
BTDataType val;
}BTNode;
遍历就是沿着某条搜索路径,树种每个结点只访问一次(下面的三种方式根据具体的应用场景来应用)
前序遍历:根结点+左子树+右子树
void beforeOrder(BTNode* root)
{
if (root)
{
printf("%d ", root->val);
beforeOrder(root->left);
beforeOrder(root->right);
}
}
中序遍历:左+根+右
void inOrder(BTNode* root)
{
if (root)
{
inOrder(root->left);
printf("%d ", root->val);
inOrder(root->right);
}
}
后续遍历:左+右+根
void endOrder(BTNode* root)
{
if (root)
{
endOrder(root->left);
endOrder(root->right);
printf("%d ", root->val)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。