表达式二叉树 中序遍历

表达式树 代码实现 中序遍历

来自《数据结构与算法分析——C语言描述》
来自《数据结构与算法分析——C语言描述》

节点类型 定义

typedef struct BinaryTreeNode {
	union element{
        int operand;//操作数
        char operator;//操作符
    }element;
	struct BinaryTreeNode* Left;
	struct BinaryTreeNode* Right;
}BinaryTreeNode_T;

中序遍历代码

void calculate_test(BinaryTreeNode_T* T) {
    if (T == NULL) {
        return;
    }
    if (T->Left != NULL) {//目前仅考虑要么两个儿子都有,要么没有儿子,即二元操作符和操作数
        printf("\(");
        calculate_test(T->Left);//左
        printf("%c", T->element.operator);//有两儿子的中序打印操作符
        calculate_test(T->Right);//右
        printf("\)");
    }
    else {//是操作数
        printf("%d", T->element.operand);//操作数直接打印,没有儿子
    }
}

建立二叉树并测试

在主函数中调用

void ExpressionTreeTest(void){
    //新建一个表达式二叉树
    int a = 3;
    int b = 5;
    int c = 6;
    int d = 10;
    int e = 11;
    int f = 12;
    int g = 13;

    BinaryTreeNode_T* node1 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node2 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node3 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node4 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node5 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node6 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node7 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node8 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node9 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node10 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node11 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node12 = malloc(sizeof(BinaryTreeNode_T));
    BinaryTreeNode_T* node13 = malloc(sizeof(BinaryTreeNode_T));

    node1->element.operator = '+';
    node1->Left = node2;
    node1->Right = node7;

    node2->element.operator = '+';
    node2->Left = node3;
    node2->Right = node4;

    node3->element.operand = a;
    node3->Left = NULL;
    node3->Right = NULL;

    node4->element.operator = '*';
    node4->Left = node5;
    node4->Right = node6;

    node5->element.operand = b;
    node5->Left = NULL;
    node5->Right = NULL;

    node6->element.operand = c;
    node6->Left = NULL;
    node6->Right = NULL;

    node7->element.operator = '*';
    node7->Left = node8;
    node7->Right = node13;

    node8->element.operator = '+';
    node8->Left = node9;
    node8->Right = node12;

    node9->element.operator = '*';
    node9->Left = node10;
    node9->Right = node11;

    node10->element.operand = d;
    node10->Left = NULL;
    node10->Right = NULL;

    node11->element.operand = e;
    node11->Left = NULL;
    node11->Right = NULL;

    node12->element.operand = f;
    node12->Left = NULL;
    node12->Right = NULL;

    node13->element.operand = g;
    node13->Left = NULL;
    node13->Right = NULL;

    //测试

    calculate_test(node1);
    //内存释放
    free(node1);
    free(node2);
    free(node3);
    free(node4);
    free(node5);
    free(node6);
    free(node7);
    free(node8);
    free(node9);
    free(node10);
    free(node11);
    free(node12);
    free(node13);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值