二叉树的遍历方式
写在前面
- 本意是仅用作个人笔记,如果有人看,哪有问题也可以说。
假定的二叉树结构
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
先序遍历
先序遍历的顺序是,根结点->左子树->右子树。
void main(struct TreeNode *tree)
{
//对于给定的根节点
//先序遍历的操作就是,打印数据,然后再递归调用左子树、右子树
//当然有个前提是,根节点不为空
if(tree)
{
printf("%d",tree->val);
main(tree->left);
main(tree->right);
}
}
中序遍历
中序遍历的顺序是,左子树->根结点->右子树。
void main(struct TreeNode *tree)
{
//对于给定的根节点
//中序遍历的操作就是,递归调用左子树,打印数据,递归调用右子树
//当然前提依然是,根节点不为空
if(tree)
{
main(tree->left);
printf("%d",tree->val);
main(tree->right);
}
//当左子树调用完了,再打印数据,自然就是中序遍历的顺序。
//而对于最左下角的叶结点而言,他没得调用左子树,便只能直接打印数据,也正好符合逻辑
}
后序遍历
后序遍历的顺序是,左子树->右子树->根结点。
void main(struct TreeNode *tree)
{
//对于给定的根节点
//后序遍历的操作就是,递归调用左子树、右子树,然后打印数据。
//当然前提还是,根节点不为空
if(tree)
{
printf("%d",tree->val);
main(tree->left);
main(tree->right);
}
}
层序遍历
- 层序遍历较特殊,需要用到队列,如果忘了内容了,那就先回去复习一下。
- 层序遍历的顺序是,从上到下,从左到右,所以用到了队列。
操作是,初始化队列,循环输出队头元素,然后先后将左、右子树放进队列。
直至输出完了,队列为空了就结束。
具体代码就是
void main(struct TreeNode *tree)
{
Queue Q; //指向队列的指针变量Q
struct TreeNode* T;
if(!tree) return; //若是空树则直接返回
Q = CreatQueue(MaxSize); 创建并初始化队列Q
AddQ(Q,tree); //将根节点tree放进队列Q
while(!IsEmpty) //当队列不是空队列时
{
T = DeleteQ(Q); //删除并返回队头元素
printf("%d",T->val);
if(T->left) AddQ(Q,T->left);
if(T->right) AddQ(Q,T->right);
}
}