二叉树的先序遍历(递归方式)详解

/*
 * 时间:2015年5月4日09:58:21
 * 目的:实现二叉树的先序遍历递归。
 * 总结和思考!二叉树一般使用链式存储结构
 * 如果使用顺序存储方式,除非二叉树是完全二叉树或者满二叉树
 * 否则会浪费很多内存空间!
*/

# include <stdio.h>

typedef struct Node{
	char data;    //数据元素
	Node *LChild; //左孩子节点
	Node *RChild; //右孩子节点

}BTree;

/*递归算法--先序遍历*/

//二叉树的创建,使用先序算法,先序遍历算法:先根后左再右的遍历顺序。
void CreateTree(BTree **tNode)
{
	char element;
	scanf("%c",&element); //#表示空结点
	if(element == '#')
		(*tNode) = NULL;
	else
	{
		/* 创建一个树结点,这个new对象就是为什么要使用二级指针的原因.要保证地址不会丢失。
		 * 那么我们来分析,假如我们不用二级指针,而是像前面使用一级指针,那么在main()函数
		 * 中传递了tree的地址,相当于tNode指向了tree地址,这就是我们的初衷,但是我们使用
		 * tNode = new Node;给树的节点指针分配内存空间,这样就导致tNode指向了新的Node地址
		 * 所以你的一切跟tNode操作都跟tree无关,所以就会导致错误!刚开始我也不是很理解为什么要
		 * 用二级指针,但是通过理解我慢慢体会到这个重要性,或者你嫌二级指针麻烦,你也可以吧BTree
		 * 定义成结构体指针*BTree,这样你就可以直接使用Btree *tNode。方法自己来选,个人认为二级指针
		 * 虽然麻烦,但是可以更加有助于理解。
		*/

		(*tNode) = new Node; //创建根节点

		(*tNode)->data = element; //给根节点的数据元素项赋值

		/*其实在写这个程序之前,我不是很理解递归内部工作机制,我只是知道递归内部是使用栈来进行操作的
		 * 所以在下一篇文章中先序的非递归创建二叉树和非递归遍历二叉树会使用到栈的知识。
		*/

		/*下面这种方法明显是递归的方式,但是我们好好想一想那么递归结束的条件是什么,是不是叶子节点的
		 * 左右子树全部为NULL,本来我不是很理解既然这里使用到了递归,那么这个算法结束的条件是什么?
		 * 大家可以想象一下叶子节点作为根节点后,它是不是也要进行CreateTree(&(*tNode)->LChild);
		 * CreateTree(&(*tNode)->RChild);这2个方法,然后我们输入了#表示左右子树都为空,这样我们就不会运行
		 * else中的代码了,所以大家记住,这个递归算法结束的条件就是叶子节点的左右孩子都为空(#)
		*/

		CreateTree(&(*tNode)->LChild); //创建左子树,这是使用递归的方式
		CreateTree(&(*tNode)->RChild); //创建右子树
	}
}
/* 输出函数(访问根节点)
 * 经常听一些视频,每次都说访问根节点,刚开始我不是很理解
 * 什么叫做访问,说白了不就是printf(),自己输出data值,所以一些理论
 * 知识真是坑害了好多人啊。
*/
void visit(BTree **tNode)
{
	if((*tNode)->data != '#')
		printf("%c ",(*tNode)->data);
}

//先序遍历
void preOrder(BTree **tNode)
{
	/* (*tNode) != NULL也是递归结束的标志语 */

	if((*tNode) != NULL)
	{
		//访问根结点
		visit(tNode);

		//访问左子结点
		preOrder(&(*tNode)->LChild);

		//访问右结点
		preOrder(&(*tNode)->RChild);
	}
}

int main()
{
	BTree *tree;

	printf("递归--创建一个二叉树,'#'表示空结点\n");

	CreateTree(&tree);

	printf("<先序遍历-递归算法:>\n");

	preOrder(&tree);

	printf("\n");

	return 0;
}

时间: 2024-10-10 09:03:27

二叉树的先序遍历(递归方式)详解的相关文章

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

树——二叉树的后序遍历(非递归)

思路: 二叉树的后序遍历非递归方法与前序,中序不同,稍微麻烦一些. 要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点cur,先将其入栈.如果cur不存在左孩子和右孩子,则可以直接访问它:或者cur存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点.若非上述两种情况,则将cur的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问. 代码如下: /** * Definition for

【算法与数据结构】二叉树的 中序 遍历

前一篇写了二叉树的先序遍历,本篇记录一下二叉树的中序遍历,主要是非递归形式的中序遍历. 由于距离上篇有好几天了,所以这里把二叉树的创建和存储结构也重复的写了一遍. 二叉树如下 二叉树的存储方式依然是二叉链表方式,其结构如下 typedef struct _tagBinTree { unsigned char value; struct _tagBinTree* left; struct _tagBinTree* right; }BinTree, *PBinTree; 先序递归形式的创建二叉树代码

二叉树的后序遍历(暴力版) 小白菜oj 1034

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历-- 作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法--但只是估计-- 下面讲述我的超暴力解法-- 首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可. 但这个方法有两个比较--&¥--&的问题:1

[LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历

Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? confused what "{1,#,2,3}" means? > read

Binary Tree Postorder Traversal 二叉树的后序遍历

地址:https://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 题意就是完成二叉树的后序遍历,我们知道如果使用递归进行二叉树后序遍历将是非常简单的事情. public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer > ans = new ArrayList<>(); Tr

leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)

题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 说明: 1) 两种实现,递归与非递归 , 其中非递归有两种方法 2)复杂度分析:时

SDUT 1489 求二叉树的先序遍历 (中序后序还原二叉树)

求二叉树的先序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的中序遍历序列,第二个字符串表示二叉树的后序遍历序列. Output 输出二叉树的先序遍历序列 Exampl

编程算法 - 中序遍历 递归/迭代 代码(C)

中序遍历 递归/迭代 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 中序遍历(InOrder)作为二叉搜索树的排序方式, 有着重要的作用. 递归和迭代的方法都需要掌握, 迭代主要使用了栈(stack)进行输入输出. 代码: /* * main.cpp * * Created on: 2014.9.18 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #inclu