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

本文探讨了二叉树与广义表之间的相互转换。通过使用栈来实现广义表到二叉树的转化,利用先进后出的特性,先将根节点压栈,再处理左右子节点。同时,介绍了如何将二叉树以广义表的形式输出,类似先序遍历的过程,依次输出根、左子树、右子树并适当添加分隔符。
摘要由CSDN通过智能技术生成

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

二叉树是树形结构中一种特殊的树,其特点是每个结点最多只有两个孩子结点。二叉树除了可以通过典型的树状图来表示外,还可以使用广义表进行表示,例如: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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值