建立、遍历二叉树(二叉链表)

建立二叉树: 

由于先序、中序、后序遍历的任何一个遍历结果单独都不能唯一确定一颗二叉树,因此不能直接使用其中任何一个遍历结果来构造二叉树(原因是不能确定左右子树的大小(节点数),或者说不知道子树的结束位置)

虽然先序、中序、后序遍历任意两种遍历结果相结合都可以唯一确定一颗二叉树,但是很不方便。

所以:只要输入为‘#’就表示该树为空,称为扩展二叉树             例输入:ABD##E##C#F##

二叉链表存储:

struct node
{
    char data;
    struct node *L_tree;
    struct node *R_tree;
};
struct node *creat_tree()//建立二叉树
{
    char ch;
    ch = getchar();
    struct node *Tree;
    Tree = (struct node *)malloc(sizeof(struct node));
    if(ch == '#')
        Tree = NULL;
    else
    {
        Tree->data   = ch;//输入本节点信息
        Tree->L_tree = creat_tree();//建左子树
        Tree->R_tree = creat_tree();
    }
    return Tree;
}
  

递归先序遍历:

void preorder_first(struct node *tree)//先序遍历
{
    if(tree != NULL)
    {
        cout << tree->data << " ";
        preorder_first(tree->L_tree);
        preorder_first(tree->R_tree);
    }
}

递归中序遍历:

void preorder_second(struct node *tree)//中序遍历
{
    if(tree != NULL)
    {
        preorder_second(tree->L_tree);
        cout << tree->data << " ";
        preorder_second(tree->R_tree);
    }
}

递归后序遍历:

void preorder_third(struct node *tree)//后序遍历
{
    if(tree != NULL)
    {
        preorder_third(tree->L_tree);
        preorder_third(tree->R_tree);
        cout << tree->data << " ";
    }
}

求树的深度:tree=NULL 时高度为0。不为空时当前tree高度是其左右子树高度的最大值+1,左右子树也是二叉树,规模变小求解一样用递归

int high(struct node *tree)//数的深度
{
    if(tree == NULL)
        return 0;
    else
        return (max(high(tree->L_tree),high(tree->R_tree))+1);
}

求树中节点数:

void nodecount(struct node *tree)//节点个数
{
    if(tree != NULL)
    {
        n++;//先序遍历计数
        nodecount(tree->L_tree);
        //n++;//中序遍历计数
        nodecount(tree->R_tree);
        //n++;//后序遍历计数
    }
}

 求树中叶节点数:

void ye_node(struct node *tree)//叶节点的个数
{
    if(tree != NULL)
    {
        if(tree->L_tree == NULL && tree->R_tree == NULL)
        {
            n1++;
        }
        ye_node(tree->L_tree);
        ye_node(tree->R_tree);
    }
}

 求树中度为 2 的节点个数:

void have_two_node(struct node *tree)//度为2的节点的个数
{
    if(tree != NULL)
    {
        if(tree->L_tree != NULL && tree->R_tree != NULL)
        {
            n2++;
        }
        have_two_node(tree->L_tree);
        have_two_node(tree->R_tree);
    }
}

  

转载于:https://www.cnblogs.com/ldy-miss/p/6044443.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值