二叉树的创建与遍历

创建

这里是按照先序次序输入节点的值,如果节点为NULL,则输入#,下面是两个例子
图一输入如下:ABC##D###
图二输入如下:ABC##DE##F##GH##K##
生成效果如下

这里写图片描述

图一

这里写图片描述

图二

遍历

先序遍历:根节点->左子树->右子树,
图一遍历结果为:A B C D
图二遍历结果为:A B C D E F G H K

中序遍历:左子树->根节点->右子树
图一遍历结果为:C B D A
图二遍历结果为:C B E D F A H G K

后序遍历:左子树->右子树->根节点
图一遍历结果为:C D B A
图二遍历结果为:C E F D B H K G A

上面三种遍历方法,可能看代码会更好理解一点

binary_tree.h

#ifndef __BINARY_TREE_H__
#define __BINARY_TREE_H__


typedef int ElementType ;

typedef struct BI_TREE_T
{
    ElementType value;
    struct BI_TREE_T *lChild;
    struct BI_TREE_T *rChild;
}BI_TREE;


extern void binary_tree_main_test(void);

#endif

binary_tree.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "binary_tree.h"


BI_TREE * binary_tree_create(void)
{
    char ch;
    BI_TREE *tree;

    scanf("%c",&ch);    
    //printf("input %c      \n", ch);

    if('#' == ch)
    {
        tree = NULL;
    }
    else
    {
        tree = (BI_TREE *)malloc(sizeof(BI_TREE));
        tree->value = ch;

        tree->lChild = binary_tree_create();
        tree->rChild = binary_tree_create();
    }

    return tree;
}

void binary_tree_preorder_traverse(BI_TREE * tree)
{
    if(tree)
    {
        printf("%c  ", tree->value);
        binary_tree_preorder_traverse(tree->lChild);
        binary_tree_preorder_traverse(tree->rChild);
    }
}

void binary_tree_inorder_traverse(BI_TREE * tree)
{
    if(tree)
    {
        binary_tree_inorder_traverse(tree->lChild);
        printf("%c  ", tree->value);
        binary_tree_inorder_traverse(tree->rChild);
    }
}

void binary_tree_postorder_traverse(BI_TREE * tree)
{
    if(tree)
    {
        binary_tree_postorder_traverse(tree->lChild);
        binary_tree_postorder_traverse(tree->rChild);
        printf("%c  ", tree->value);
    }
}

void binary_tree_destroy(BI_TREE * tree)
{
    if(tree)
    {
        binary_tree_destroy(tree->lChild);
        binary_tree_destroy(tree->rChild);
        free(tree);
        tree = NULL;
    }
}

void binary_tree_main_test(void)
{
    BI_TREE  *tree = binary_tree_create();

    printf("\nPreorder traverse : ");
    binary_tree_preorder_traverse(tree);

    printf("\nInorder traverse : ");
    binary_tree_inorder_traverse(tree);

    printf("\nPostorder traverse : ");
    binary_tree_postorder_traverse(tree);
    printf("\n");

    binary_tree_destroy(tree);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值