二叉树的输出 - 以凹入表表示法输出一棵二叉树(C语言)

前言:

最近在看一本书,是红衣教主周鸿祎写的《我的互联网方法论》,他讲到了互联网的本质——Free,没错,就是免费,Internet这条信息高速公路不仅仅需要哪些专业人士去建造,而且需要我们每一个人来贡献出一些东西,我们需要站在巨人的肩膀上去眺望未来,编程也是这样,不要刀耕火种,我们需要交流,相互交流,这也是我为什么要花我的一部分时间来写博客的原因,我所写的这些东西也许都是上个世纪的产物了,很多人都在写,但是我希望我们每个人都来写,因为分享知识从来都是一件令人快乐的事。

凹入表表示法:使用栈将二叉树中的数据按照指定格式(兄弟间等长、(r)代表根节点、(0)代表左节点、(1)代表右节点)输出。

完整代码如下:

/* 二叉树的输出 - 以凹入表表示法输出一棵二叉树 */

#include "stdafx.h"
#include <iostream>
#include <malloc.h>
using namespace std;
const int MaxSize = 40;

//链式二叉树节点数据类型定义 
typedef char ElementType;
typedef struct bitnode
{
	ElementType data;
	struct bitnode *left, *right;
} bitnode, *bitree;                       //注意:这里的bitree相当于bitnode*  



										  //函数声明
bitree CreateTree();                 //先序法创建一棵二叉树
void DispTree(bitree b);             //以凹入表表示法输出一棵二叉树
bitree FreeTree(bitree b);           //释放空间



									 //先序法创建一棵二叉树
bitree CreateTree()
{
	bitree T;
	ElementType ch;
	cin >> ch;
	if (ch == '#')            //输入'#'代表空树 
		T = NULL;
	else
	{
		T = (bitree)malloc(sizeof(bitnode));
		T->data = ch;                       //先根节点 

		T->left = CreateTree();            //递归先序建立其左子树
		T->right = CreateTree();           //递归先序建立其右子树 
	}

	return T;              //返回建好的树根节点 
}

//以凹入表表示法输出一棵二叉树,兄弟间等长
void DispTree(bitree b)
{
	bitree stack[MaxSize], p;          //stack[top]为指针数组 
	int level[MaxSize][2], top, i, n, width = 4;
	//top为stack栈指针、levle[MaxSize][2]为二维数组,0维度-width(输出空格数)、1维度-不同节点
	char type;

	if (b != NULL)
	{
		top = 1;                  //左节点之前输出(0)
		stack[top] = b;        //根节点入栈
		level[top][0] = width;
		level[top][1] = 2;     //2代表根节点

		while (top > 0)        //栈不为空时,循环继续 
		{
			p = stack[top];        //退栈并凹入显示该节点值
			n = level[top][0];

			switch (level[top][1])
			{
			case 0:
				type = '0';         //左节点之前输出(0)
				break;
			case 1:
				type = '1';        //右节点之前输出(1) 
				break;
			case 2:
				type = 'r';        //根节点之前输入(r)
				break;
			}

			for (i = 1; i <= n; i++)           //n为输出的空格数,字符以右对齐显示 
				cout << " ";
			cout << p->data << " (" << type << ")";
			for (i = n + 1; i <= MaxSize; i += 2)
				cout << "-";
			cout << endl;
			top--;                     //根节点出栈

			if (p->right != NULL)
			{
				top++;
				stack[top] = p->right;          //将右子树根节点入栈 
				level[top][0] = n + width;        //输出空格数增加width 
				level[top][1] = 1;              //1表示是右子树 
			}
			if (p->left != NULL)
			{
				top++;
				stack[top] = p->left;          //将左子树根节点入栈 
				level[top][0] = n + width;        //输出空格数增加width  
				level[top][1] = 0;              //0代表左子树 
			}
		}
	}
}

//释放空间 
bitree FreeTree(bitree b)
{
	if (b != NULL)
	{
		FreeTree(b->left);           //递归释放其左子树 
		FreeTree(b->right);          //递归释放其右子树 

		free(b);                 //释放根节点
		b = NULL;                    //释放指向根节点的指针 
	}

	return b;                        //返回NULL; 
}

int main()
{
	bitree root;

	cout << "请按先序创建二叉树的方式输入一组数据:";
	root = CreateTree();
	getchar();

	cout << "以凹入表表示法输出二叉树:";
	cout << endl;
	DispTree(root);
	cout << endl;

	root = FreeTree(root);
	if (root == NULL)
		cout << "释放成功" << endl;

	return 0;
}

运行结果:

  • 15
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值