二叉树遍历之递归遍历

前文 二叉树的实现 简单讲解了基本概念,创建一颗树的过程

遍历整棵树最常用的还是递归遍历,代码实现容易

遍历顺序:

        谈及遍历,通常为操作该节点,比如打印节点值;而经过并不是遍历的意思

        前序遍历:根,左,右

        中序遍历:左,根,右

        后序遍历:左,右,根

       

实现原理:

        以前序遍历为例,顺序为:根,左,右

        1. 根节点入栈

        2. 开启循环,每次出栈一元素,打印其值;

           如果有子节点,要先入栈右子节点,再入栈左子节点。这样出栈顺序才能保证是先左,后右

      

图示说明:

1. 根节点入栈,然后出栈

二叉树遍历之递归遍历_第1张图片

2. 右子节点,左子节点都存在,分别入栈,然后出栈左子节点

二叉树遍历之递归遍历_第2张图片

3. 左子节点,其存有左子节点,入栈,再出栈

二叉树遍历之递归遍历_第3张图片

4. 没有后续子节点,继续出栈节点 3

二叉树遍历之递归遍历_第4张图片

5. 同理后续情况

二叉树遍历之递归遍历_第5张图片

二叉树遍历之递归遍历_第6张图片

二叉树遍历之递归遍历_第7张图片

代码实现:

依据图示说明,遇见根节点就打印,然后递归左节点,递归右节点

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);
}

小结:

递归遍历是非常常用的手法来实现访问树的所有节点

我们也知道递归与迭代是可以互相转换的,后续章节我们会继续用迭代的方式来实现 前、中、后序遍历 

二叉树遍历之迭代遍历

 更多数据结构详解

你可能感兴趣的:(数据结构,树)