前言:
最近在看一本书,是红衣教主周鸿祎写的《我的互联网方法论》,他讲到了互联网的本质——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;
}