二叉树
二叉树是每个节点最多有两个子树的树结构
满二叉树和完全二叉树
二叉树的第i层最多有2i-1给节点,如果每一层的节点树都是满的,那么称之为满二叉树。如果满二叉树只在最后一层缺失,并且缺失的节点都在右边,则称这种二叉树为完全二叉树。
完全二叉树的性质
一颗节点树为k的完全二叉树,设1号节点为根结点,有一下性质
(1)i>1的节点,其父节点为i/2;
(2)如果2i>k,那么节点i没有孩子;如果2i+1>k,那么没有右孩子;
(3)如果节点i有孩子,那它的左孩子是2i,右孩子是2i+1;
因为有了以上这几条性质,使得我们可以利用数组轻松地表示完全二叉树。
二叉树的储存结构
二叉树一般的存储一般利用指针和结构体来实现,在结构体中定义三个变量,其中一个变量用来表示关键信息,另外两个用指向结构体的指针来分别指向左孩子和右孩子。

struct node{
int data;//关键信息
node*left;//指向左孩子的指针
node*right;//指向右孩子的指针
}
二叉树的遍历
广度优先遍历(BFS)
按照树结构从上往下从左往右地遍历方式称为广度优先遍历,这种遍历方式需要借助队列才能实现。例如下图所示二叉树广度优先遍历结果为AEGFHIJ

深度优先遍历(DFS)
深度优先遍历就是沿着树结构的某一条路径一直遍历到尽头后再回头来遍历未被访问过的节点,深度优先遍历有三种遍历方式,分别为先序遍历,中序遍历和后序遍历。这三种遍历方式的区别在于访问节点的顺序,先序遍历会先访问根节点再访问左孩子节点最后访问右孩子节点;中序遍历会先访问左子节点再访问根节点最后访问右子节点;后序遍历会先访问左子节点再访问右子节点最后访问根节点。

如上图所示的二叉树按先序遍历结果为AEFHGIJ,中序遍历结果为FEHAGJI,后序遍历结果为FHEJIGA。
对于深度优先遍历我们一般采用递归的方式进行,当然我们也可以利用栈来模拟递归的过程来实现深度优先遍历。
//先序遍历
void preorder(Tree root) {
if (root) {
printf("%d ", root->data);
preorder(root->left);
preorder(root->right);
}
}
//中序遍历
void inorder(Tree root) {
if (root) {
inorder(root->left);
printf("%d ", root->data);
inorder(root->right);
}
}
//后序遍历
void postorder(Tree root) {
if (root) {
postorder(root->left);
postorder(root->right);
printf("%d ", root->data);
}
}
1万+

被折叠的 条评论
为什么被折叠?



