二叉树的输出:以凹入表示法输出家谱

本文介绍了在学习二叉树时遇到的问题,即使用二叉树来表示家谱的输出代码存在错误。作者发现了这个问题,并通过增加一个判断条件成功修正了代码,使得家谱能正确地以凹入表示法显示。

最近在学习二叉树,用二叉树输出家谱,浏览了一些网页,发现有的代码和实验指导书上的代码都错在一个地方,造成输出错误。如下:
在这里插入图片描述
小小修改了下,增加了个判断条件,成功输出

void DispTree(BTree bt)
{
	BTree S[MaxSize], p;
	int Level[MaxSize][2],top,i,n,width=4;
	if (bt!=NULL)
	{
		cout<<" 家谱凹入表示法 "<<endl;
        top=1;
		S[top]=bt;				//根节点 进栈
		Level[top][0]=width;
		while (top>0)
        {
			p=S[top];		
			n=Level[top][0];
			for (i=1;i<=n;i++) 
				cout<<" ";
			cout<<p->name;
			if (Level[top][1]==1)
				cout<<"(l)";
			else
				cout<<"(r)";
			for (i=n+1;i<=MaxSize-6;i+=2)
				cout<<"--";
			cout<<endl;
			top--;
			if (p->rchild!=NULL)
			{								
				top++;
				S[top]=p->rchild;
				
				if(Level[top][1]==2)//增加判断条件,如果该节点是右子树且它的右子树也存在,
				{                   //说明改节点的右子树为其兄弟,其显示场宽增不用再增加width
					Level[top][0]=n; 
				} 
				else {Level[top][0]=n+width;}		//显示场宽增width
				
				Level[top][1]=2;			//为右子树节点
			}
			if (p->lchild!=NULL)
			{							
				top++;
				S[top]=p->lchild;
				Level[top][0]=n+width;		//显示场宽增width
				Level[top][1]=1;			//为左子树节点
			}
        }
	}
}

输出如下:

在 C 语言中,使用表示法(Infix to Postfix Conversion)将中缀表达式转换为后缀表达式(Postfix或也称为逆波兰表示法),然后再递归地计算二叉树结构以输出二叉树。这里是一个简单的示例,展示如何实现这个过程: 首先,我们需要一些基本的数据结构来代表节点和栈: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; typedef struct Stack { TreeNode **nodes; int top; int size; } Stack; ``` 然后创建函数来进行中缀到后缀的转换: ```c void infixToPostfix(char* infix) { Stack *stack = (Stack*) malloc(sizeof(Stack)); stack->top = -1; stack->size = 10; // 初始化栈大小 char *postfix = (char*) malloc(strlen(infix) + 1); postfix[strlen(infix)] = '\0'; // 预留空间 for (int i = 0; infix[i] != '\0'; ++i) { if (isOperator(infix[i])) { // 如果是运算符 while (!stack->isEmpty() && isOperator(stack->nodes[stack->top]) && precedence(stack->nodes[stack->top], infix[i]) >= precedence(stack->nodes[stack->top], infix[i - 1])) { postfix[++stack->top] = stack->nodes[stack->top]; stack->nodes[stack->top - 1] = &infix[i]; } stack->nodes[++stack->top] = &infix[i]; } else { // 如果是数字,直接添加到后缀 postfix[++stack->top] = infix[i]; } } while (!stack->isEmpty()) { postfix[++stack->top] = stack->nodes[stack->top]; } printf("Postfix expression: %s\n", postfix); } // 其他辅助函数,如判断是否为运算符、比较优先级等 ``` 接下来,你需要构建二叉树,并通过后缀表达式遍历它来输出: ```c TreeNode* buildTree(char* postfix) { // ... 这里需要实现从后缀表达式解析并构建二叉树的算法 return root; // 返回根节点 } void printPreorder(TreeNode* node) { if (node == NULL) return; printf("%d ", node->val); // 假设已经实现了前序遍历 } int main() { char infix[] = "A+B*C"; // 中缀表达式 infixToPostfix(infix); TreeNode* root = buildTree(postfix); // 构建二叉树 printPreorder(root); // 输出二叉树 free(postfix); free(stack); return 0; } ``` 请注意,这个例子并没有包含完整的从后缀表达式构建二叉树的细节,这通常涉及到栈的操作以及更复杂的算法,例如Shunting Yard算法。这部分你可以查阅相关资料进一步学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值