广义表与二叉树之间的相互转换

广义表与二叉树之间的相互转换

二叉树是树形结构中一种特殊的树,其特点是每个结点最多只有两个孩子结点。二叉树除了可以通过典型的树状图来表示外,还可以使用广义表进行表示,例如:A(B,C)表示根结点A的左孩子结点为B,右孩子结点为C;A(,C)表示根结点A的左子树为空,右孩子结点为C。依此类推,可以将任何一棵二叉树以广义表的形式表示出来。

广义表转化为二叉树
广义表转化成二叉树可以借助栈来实现,利用栈先进后出的特点,先将根结点压入栈中,如果左孩子结点不为空,则将其作为栈顶结点的左孩子结点,并压入栈中,递归左子树,处理完之后左孩子结点出栈;如果右孩子不为空,则将其作为栈顶结点的右孩子结点,并压入栈中,递归右子树,处理完之后右孩子结点出栈。

/*
设置一个标记变量flag,初始值为-1,并设置一个标记结点
循环遍历广义表的字符串str
	如果str[i]是左括号:
		把flag置为0;
		把p压入栈中
	否则如果str[i]是逗号:
		把flag置为1;
	否则如果str[i]是右括号:
		则栈顶元素出栈;
	否则如果str[i]是一个字母,则用结点temp来存储;
		如果flag为-1:
			则把temp作为根结点并压入栈中
		如果flag为0:
			如果此时栈顶结点为p,则先出栈,然后将temp作为栈顶结点的左孩子,并将temp压入栈中
		如果flag为1:
			栈顶元素出栈,将temp作为栈顶结点的右孩子,并将temp压入栈中
*/
Node *build(const string &str) {
   
    int len = str.size();
    if(len == 0) return NULL;
    stack<Node *> stk;
    Node *temp = NULL, *p = new Node('#');
    int flag  = -1;
    for(int
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
二叉树广义表表示法是一种用字符串来表示二叉树的方法,在广义表中,每个节点都可以是一个数据元素,也可以是一个子广义表广义表表示法可以用来表示二叉树,也可以用来表示一般的二叉树广义表表示法是一种递归定义,它可以用以下的方式来表示一个二叉树: 1. 如果该二叉树为空,那么它的广义表表示为()。 2. 如果该二叉树不为空,那么它的广义表表示为“(数据元素,左子广义表,右子广义表)”。 例如,对于以下的二叉树: ``` A / \ B C / / \ D E F ``` 它的广义表表示为:(A,B(D,(),()),C(E,(),F)) 下面是C语言实现二叉树广义表形式的链表结构的代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 二叉树结点 typedef struct node { char data; // 数据域 struct node *left; // 左子指针 struct node *right; // 右子指针 } Node; // 创建新结点 Node *new_node(char data) { Node *node = (Node *)malloc(sizeof(Node)); node->data = data; node->left = NULL; node->right = NULL; return node; } // 构建二叉树 Node *build_tree(char *str, int *index) { Node *root = NULL; if (str[*index] != '(') { // 如果当前字符不是'(',则返回空指针 return NULL; } *index += 1; // index指向下一个字符 if (str[*index] != ')') { // 如果当前字符不是')',则创建新结点 root = new_node(str[*index]); *index += 1; // index指向下一个字符 root->left = build_tree(str, index); // 递归构建左子 root->right = build_tree(str, index); // 递归构建右子 } *index += 1; // index指向下一个字符 return root; } // 中序遍历二叉树 void inorder(Node *root) { if (root == NULL) { return; } inorder(root->left); printf("%c ", root->data); inorder(root->right); } int main() { char *str = "(A,B(D,(),()),C(E,(),F))"; int index = 0; Node *root = build_tree(str, &index); inorder(root); return 0; } ``` 该程序将输出:D B A E C F

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值