二叉树还原成普通树

transform方法流程:
1、构造两个队列,普通树队列和二叉树队列。
2、将二叉树的根入队列,构造普通树的根顶点并入对应队列。
3、循环判断二叉树队列不为空。
4、从两个队列中分别取出一个元素,分别为bnode,node。
5、当bnode没有左孩子时,不考虑这种情况。因为此时的node没有孩子。
6、当bnode有左孩子时,构造普通树节点,数据为左孩子的数据。将该普通节点和左孩子分别入对应队列。同时让node的第一个孩子指针指向该树节点。(对同一个点而言二叉树的左孩子为树的第一个孩子)
7、从这个普通节点开始,一直寻找它的右孩子。每找到一个,对应构造一个二叉树节点。并将这些节点依次赋给node的孩子指针。同时将这些构造节点和二叉树的右孩子节点入队列。

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

#define N 3 //定义每个节点的最大孩子数
#define M 9 //定义树中节点的个数

struct TreeNode
{
    char data;
    struct TreeNode *childs[N];
};
typedef struct TreeNode TreeNode; //定义类型

struct BTreeNode
{
    char data;
    struct BTreeNode *lchild, *rchild;
};
typedef struct BTreeNode BTreeNode;

/*------------------普通树的队列开始--------------------*/
struct QueueTree
{
    int i, j;
    TreeNode **queue;
};
typedef struct QueueTree QueueTree;

QueueTree * initQueueTree()
{
    //分配一个队列空间
    QueueTree *tree = (QueueTree *)malloc(sizeof(QueueTree)); 
    //分配M个树节点指针空间
    tree->queue = (TreeNode **)malloc(sizeof(TreeNode *)*M); 
    tree->i = 0;
    tree->j = 0;
    return  tree;
};

void freeQueueTree(QueueTree *tree) //释放分配空间
{
    free(tree->queue);
    free(tree);
}

void addQueueTree(QueueTree *tree, TreeNode *node) //加入队列
{
    if(tree->j == M) //队列已满
        return;
    tree->queue</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要将一个表达式二叉树换成中缀,可以按照以下步骤进行: 1. 对于叶子节点,直接将节点的值作为中缀表达式的一个操作数。 2. 对于非叶子节点,如果节点的值是一个运算符,则将其左子和右子分别换成中缀表达式,并将它们与当前节点的运算符拼接成一个完整的中缀表达式。 3. 如果当前节点的值不是运算符,则直接将其值作为中缀表达式的一个操作数。 4. 最终得到的中缀表达式即为中缀。 举例说明,假设有以下的表达式二叉树: ``` * / \ + 5 / \ 3 4 ``` 按照上述步骤进行换,可以得到以下的中缀: ``` __*__ / \ + 5 / \ 3 4 ``` 其中,中缀表达式为:3 + 4 * 5。 ### 回答2: 表达式二叉树换成中缀是将一个以表达式二叉树表示的数学表达式换为中缀表达式的过程。 要将表达式二叉树换为中缀,可以使用递归的方法进行操作。首先,我们需要理解表达式二叉树的结构。 表达式二叉树是一种二叉树,其中每个节点都可以是操作符或操作数。操作符节点的左子和右子分别代表了操作符的两个操作数,而操作数节点则没有子节点。 要将表达式二叉树换为中缀,可以按照以下步骤进行操作: 1. 若当前节点为操作数节点,则直接返回该节点的值作为中缀表达式的一个操作数。 2. 若当前节点为操作符节点,则需要将其左子和右子分别换为中缀表达式,并用当前节点的值将它们连接起来。 3. 需要注意的是,由于中缀表达式要求操作符的顺序和优先级,需要添加一些括号来确保正确计算。具体来说,如果当前节点的操作符比其左子节点的操作符优先级低,则需要在左子节点的中缀表达式前后添加括号。如果当前节点的操作符比其右子节点的操作符优先级低(或相等),则只需要在右子节点的中缀表达式前后添加括号。 4. 最后,将经过上述操作得到的中缀表达式返回。 通过以上步骤,我们可以将表达式二叉树换为对应的中缀。这样做的好处是方便理解和运算,同时也符合数学表达式的规范形式。 ### 回答3: 表达式二叉树是一种用二叉树表示数学表达式的结构,其中每个节点都是操作符或操作数。要将表达式二叉树换成中缀表达式,需要遵循以下步骤: 1. 从根节点开始遍历二叉树。如果当前节点是操作数,则直接将其值作为中缀表达式的一个值。 2. 如果当前节点是操作符,则将其值添加到中缀表达式中。 3. 检查当前节点的左右子节点。如果子节点也是操作符,则使用括号将它们括起来,并将其添加到中缀表达式中。 4. 重复步骤1-3,直到遍历结束并生成完整的中缀表达式。 例如,考虑以下表达式二叉树: + / \ * 3 / \ 2 5 从根节点开始遍历,首先遇到操作符'+', 将其添加到中缀表达式中,得到'+'。 然后检查左子节点,发现是操作符'*',将其添加到中缀表达式,现在表达式变为'*+'。 然后检查左子节点的左子节点,发现是操作数2,将其添加到中缀表达式中,现在表达式为'2*+'。 然后检查左子节点的右子节点,发现是操作数5,将其添加到中缀表达式中,得到'2*5+'。 最后检查根节点的右子节点,发现是操作数3,将其添加到中缀表达式中,最终得到完整的中缀表达式'2*5+3'。 通过以上步骤,我们可以将表达式二叉树换成中缀表达式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值