前文 二叉树的实现 简单讲解了基本概念,创建一颗树的过程
遍历整棵树最常用的还是递归遍历,代码实现容易
遍历顺序:
谈及遍历,通常为操作该节点,比如打印节点值;而经过并不是遍历的意思
前序遍历:根,左,右
中序遍历:左,根,右
后序遍历:左,右,根
实现原理:
以前序遍历为例,顺序为:根,左,右
1. 根节点入栈
2. 开启循环,每次出栈一元素,打印其值;
如果有子节点,要先入栈右子节点,再入栈左子节点。这样出栈顺序才能保证是先左,后右
图示说明:
1. 根节点入栈,然后出栈
2. 右子节点,左子节点都存在,分别入栈,然后出栈左子节点
3. 左子节点,其存有左子节点,入栈,再出栈
4. 没有后续子节点,继续出栈节点 3
5. 同理后续情况
代码实现:
依据图示说明,遇见根节点就打印,然后递归左节点,递归右节点
void preorder(struct TreeNode* root)
{
if(root == NULL)
return;
printf("val=%d\n",root->val);
preorder(root->left);
preorder(root->right);
}
中序遍历,后序遍历雷同,代码如下:
void inorder(struct TreeNode* root)
{
if(root == NULL)
return;
inorder(root->left);
printf("val=%d\n",root->val);
inorder(root->right);
}
void postorder(struct TreeNode* root)
{
if(root == NULL)
return;
postorder(root->left);
postorder(root->right);
printf("val=%d\n",root->val);
}
小结:
递归遍历是非常常用的手法来实现访问树的所有节点
我们也知道递归与迭代是可以互相转换的,后续章节我们会继续用迭代的方式来实现 前、中、后序遍历