美文网首页
二叉树操作集

二叉树操作集

作者: 日常表白结衣 | 来源:发表于2017-08-04 22:35 被阅读0次
/* 二叉树操作集 */

#include<stdio.h>
#include<stdlib.h>

typedef char ElementType;
typedef struct TreeNode *BinTree;
struct TreeNode {
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreateBinTree(); //建立二叉树
void InOrderTraversal(BinTree bt); //输出二叉树
void PreOrderTraversal(BinTree bt);
int TreeHigh(BinTree bt); //求树高度
void PreorderPrintLeaves(BinTree bt); //先序输出叶节点

int main()
{
    BinTree BT = NULL;
    BT = CreateBinTree();
    InOrderTraversal(BT);

    putchar('\n');
    PreOrderTraversal(BT);

    printf("the high of the tree:%d\n", TreeHigh(BT));

    PreorderPrintLeaves(BT);

    system("pause");

    return 0;
}

/*
    建立二叉树
    先序遍历 根节点-左子树-右子树
    输入:A B D H # # I # # E # # C F # J # # G # # #####
    树:
    A
    BC
    DEFG
    HI###J##
    #####################
*/
BinTree CreateBinTree()
{
    BinTree bt;
    char node;
    scanf_s("%c", &node);
    getchar();

    if (node != '#') {
        bt = (BinTree)malloc(sizeof(struct TreeNode));
        bt->Data = node;
        bt->Left = CreateBinTree();
        bt->Right = CreateBinTree();
    }
    else
        bt = NULL;

    return bt;
}

/*
    输出二叉树
    先序遍历(PreOrderTraversal):根-左-右
    中序遍历(InOrderTraversal):左-根-右
    后序遍历(PostOrderTraversal): 左-右-根
*/
void InOrderTraversal(BinTree bt)
{
    if (bt) {
        InOrderTraversal(bt->Left);
        printf("%c ", bt->Data);
        InOrderTraversal(bt->Right);
    }
}
void PreOrderTraversal(BinTree bt)
{
    if (bt) {
        printf("%c ", bt->Data);
        PreOrderTraversal(bt->Left);
        PreOrderTraversal(bt->Right);
    }
}

/*
    递归:求左子树的高度,求右子树的高度,
          Max(left,rigth)+1;
*/
int TreeHigh(BinTree bt)
{
    if(bt==NULL)    return 0;

    int lefthigh=TreeHigh(bt->Left)+1;
    int righthigh=TreeHigh(bt->Right)+1;
    return (righthigh>lefthigh)?righthigh:lefthigh;

    /*
    if(bt==NULL) return 0;
    else{
            lefthigh=TreeHigh(bt->Left);
            righthigh=TreeHigh(bt->Right);
            return (righthigh>lefthigh)?righthigh+1:lefthigh+1;
        }
    */
}

/*
    递归:输出树的叶节点
*/
void PreorderPrintLeaves(BinTree bt)
{
    if(bt){
        if(bt->Left==NULL&&bt->Right==NULL){
            printf("%c ", bt->Data);
        }
        PreorderPrintLeaves(bt->Left);
        PreorderPrintLeaves(bt->Right);
    }
}

相关文章

网友评论

      本文标题:二叉树操作集

      本文链接:https://www.haomeiwen.com/subject/uzgblxtx.html