C语言 二叉树的遍历

树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。
要学好二叉树,要对递归的技巧有一定的掌握,需要平时的积累吧。

接下来为大家介绍一下创建二叉树和遍历二叉树
首先创建一个二叉树的结点的结构体

typedef struct tree
{
    int data;              //定义一个树节点的结构体,这里我把树里面的数据简单的定义为int型的data
    struct tree *l,*r;
}TREE;

创建二叉树结点的函数

TREE* create_node(int data)            //创建树的结点,返回这个结点的地址
{
    TREE* root = malloc(sizeof(TREE)); //给结点在堆里开辟一个空间 
    root->data = data;                 //给结点赋数据
    root->l = root->r = NULL;
    return root;
}
创建一个二叉树的函数

TREE* create_tree(int n)              //创建一个简单的二叉树,返回根节点的地址
{
    TREE *root = create_node(n);
    if(2*n<10)
        root->l=create_tree(2*n);
    if(2*n+1<10)
	root->r=create_tree(2*n+1);
    return root;
}
接下来就是遍历二叉树了

首先给大家写出先序遍历的代码。

void show_tree_pre(TREE *root)       //先序遍历,就是将要操作树的代码写在递归的前面
{
    if(root == NULL)                 //递归出口
	return;
    printf("%d-",root->data);        //操作:打印结点里面的数据
    show_tree_pre(root->l);          //先序遍历左子树
    show_tree_pre(root->r);          //先序遍历右子树
}

中序遍历

void show_tree_mid(TREE *root)       //中序遍历,就是将要操作树的代码写在两条递归代码的中间
{
    if(root == NULL)
	return;
    show_tree_mid(root->l);
    printf("%d-",root->data);            //与先序同理
    show_tree_mid(root->r);
}

后序遍历

void show_tree_post(TREE *root)       //后续遍历
{
    if(root == NULL)
	return;
    show_tree_post(root->l);
    show_tree_post(root->r);
    printf("%d-",root->data);
}

以上就是二叉树的三种基本遍历方式。

下面写出主函数

int main()
{                  
      TREE *root = create_tree(1);

      show_tree_pre(root);
      puts("");
      show_tree_mid(root);
      puts("");
      show_tree_post(root);
      puts("");
	return 0;
}

输出结果为

1-2-4-8-9-5-3-6-7-
8-4-9-2-5-1-6-3-7-
8-9-4-5-2-6-7-3-1-

终结一下,先序就是根->左子树->右子树  

                   中序则是左子树->根->右子树

                   后序是 左子树->右子树->根

以上面三种方式递归,可以遍历整个二叉树

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值