带权最优二叉树怎么画

带权最优二叉树怎么画,第1张

BOT:带权最优二叉树是一种特殊的二叉树,它是由权值数组和一个权值矩阵组成的。要画出带权最优二叉树,首先要根据权值数组和权值矩阵构建出权值矩阵,然后用先序遍历的方式,遍历权值矩阵,完成二叉树的构建,最后将二叉树画出来,即可得到带权最优二叉树。

根据 层次遍历序列ABCDEFG, 中序遍历序列BAFGDCE, 得到的二叉树是:
     A
   /  \
  B    C
      / \
     D   E
    /
   F
    \
     G
先序遍历序列: ABCDFGE
中序遍历序列: BAFGDCE
后序遍历序列: BGFDECA
层次遍历序列: ABCDEFG
如果是如下形状的二叉树,则
层次遍历序列仍然是ABCDEFG,但是,中序遍历序列是BAFDGCE (D,F,G的结构不同了)
     A
   /  \
  B    C
      / \
     D   E
    / \
   F   G
// C代码测试程序
// 输入先序扩展序列: AB##CDF#G###E##
// 输出4种遍历结果
// 先序遍历序列: ABCDFGE
// 中序遍历序列: BAFGDCE
// 后序遍历序列: BGFDECA
// 层次遍历序列: ABCDEFG
//
// 二叉树示意图:
//     A
//   /  \
//  B    C
//      / \
//     D   E
//    /
//   F
//    \
//     G
//
#include <stdioh>
#include <stdlibh>
#define OK 1
#define OVERFLOW -2
typedef int Status;
typedef char TElemType;
typedef int bool;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode lchild;
    struct BiTNode rchild;
}BiTNode, BiTree;
typedef BiTNode  QElemType;
typedef struct QNode
{
    QElemType data;
    struct QNode  next;
}QNode, QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
Status InitQueue_L(LinkQueue Q)
{
    (Q)front = (QueuePtr) malloc (sizeof(QNode));
    if ((Q)front == NULL)
        return OVERFLOW;
    (Q)front->next = NULL;
    (Q)rear = (Q)front;
    return OK;
}
bool QueueEmpty_L(LinkQueue Q)
{
    return (Qfront == Qrear);
}
Status EnQueue_L(LinkQueue Q, QElemType e)
{
    QNode s = (QNode ) malloc (sizeof(QNode));
    s->data = e;
    s->next = NULL;
    (Q)rear->next = s;
    (Q)rear = s;
    return OK;
}
Status DeQueue_L(LinkQueue Q)
{
    QNode q = (Q)front->next;
    (Q)front->next = q->next;
    if (q->next == NULL)
        (Q)rear = (Q)front;
    free(q);
    return OK;
}
//创建二叉树: 先序扩展序列 + 递归法
void CreateBiTree(BiTree T)
{
    char input;
    scanf("%c",&input); //输入数据
    if(input == '#')    //'#'是空节点
    {
       T = NULL;
    }
    else
    {
        T=(BiTree)malloc(sizeof(BiTNode));
        if(T == NULL)
        {
            printf("\n分配动态内存时出错\n");
            exit(1);
        }
        (T)->data=input;
        CreateBiTree(&((T)->lchild));
        CreateBiTree(&((T)->rchild));
    }
}
void PreOrder(BiTree T) //先序遍历
{
    if(T != NULL)
    {
        printf("%c",T->data);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}
void InOrder(BiTree T) //中序遍历
{
    if(T != NULL)
    {
        InOrder(T->lchild);
        printf("%c",T->data);
        InOrder(T->rchild);
    }
}
void PostOrder(BiTree T) //后序遍历
{
    if(T != NULL)
    {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c",T->data);
    }
}
void LevelOrder(BiTree T) //层序遍历
{
    LinkQueue Q;
    BiTree p = T;
    if(p == NULL)
    {
        return;
    }
    InitQueue_L(&Q);
    EnQueue_L(&Q, p);
    while( !QueueEmpty_L(Q) )
    {
        p = Qfront->next->data;
        DeQueue_L(&Q);
        printf("%c",p->data);
        if(p->lchild != NULL)
        {
            EnQueue_L(&Q, p->lchild);
        }
        if(p->rchild != NULL)
        {
            EnQueue_L(&Q, p->rchild);
        }
    }
}
int main()
{
    BiTree T;
    CreateBiTree(&T);
    printf("先序遍历序列: ");
    PreOrder(T);
    printf("\n");
    printf("中序遍历序列: ");
    InOrder(T);
    printf("\n");
    printf("后序遍历序列: ");
    PostOrder(T);
    printf("\n");
    printf("层次遍历序列: ");
    LevelOrder(T);
    printf("\n");
    return 0;
}

首先要搞明白二叉树的几种遍历方法:(1)、先序遍历法:根左右;(2)、中序遍历法:左根右;(3)、后序遍历法:左右根。其中根:表示根节点;左:表示左子树;右:表示右子树。
至于谈到如何画先序遍历的流程图,可以这样考虑:按照递归的算法进行遍历一棵二叉树。
程序首先访问根节点,如果根节点的值为空(NULL),则停止访问;如果根节点的值非空,则递归访问二叉树的左子树(left),然后是依然判断二叉树下面的左子树下面的根节点是否为空(NULL),如果根节点的值为空(NULL),则返回上一层,再访问二叉树的右子树(right)。
依此类推。

1画二叉树没有模板,也无需特别模板。
2一般我画,用的是“框图”或直接用绘图工具。用三个“圆”作为结点,并将它们连接起来。
3必要时可用“新建-->软件和数据库-->程序结构”


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12610781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存