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


建立二叉树: 

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

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

所以:只要输入为‘#’就表示该树为空,称为扩展二叉树             例输入: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);
    }
}

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM