树与二叉树的遍历
我们平时用的树都是二叉树
一、一些基础概念
1. 树就是一种:一对多的数据结构。树离不开递归,因为“树”就是“树”中有“树”。
二叉树就是 :空树 或者 每个结点的子结点个数小于等于2。
满二叉树: 除叶子结点外所有结点的子结点个数都为2并且所有的叶子结点都在同一层。
2.一棵树只有一个根和若干个子树,子树之间是互不相交的。
3.结点拥有的子结点数称为节点的度,度为0就称为叶子结点。
4.树的度=这棵树里最大的度。
以上这棵树的度为3(注意:这是树,不是二叉树)
二、二叉树的结构
typedef struct treeNode{//结点结构
int data;//结点数据
struct treeNode* left,*right;//左右子树
}treeNode,*treeNode;
三、二叉树的遍历
怎么记:一切以根结点为重!!!左在前右在后
先序遍历就是根结点在前面,中序遍历就是根结点在中间,后续遍历就是根结点在后面。
1.先序遍历
若为空则返回空,否则:根->左子树->右子树。
void preTraverse(treeNode* t){
if(!t) return ;
v.push_back(t->data);//先保存当前结点的数据
preTraverse(t->left);//遍历左子树
preTraverse(t->right);//遍历右子树
}
2.中序遍历
若为空则返回空,否则:左子树->根->右子树 。
void preTraverse(treeNode* t){
if(!t) return ;
preTraverse(t->left);//先遍历左子树
v.push_back(t->data);//回退到当前结点,保存当前结点的数据
preTraverse(t->right);//遍历当前结点的右子树
}
3.后序遍历
若空则返回空,否则:左子树->右子树->根
void preTraverse(treeNode* t){
if(!t) return ;
preTraverse(t->left);//先遍历当前结点左子树
preTraverse(t->right);//遍历当前结点的右子树
v.push_back(t->data);//当前结点的数据
}