@【数据结构】(二叉树叶子节点构造单链表)
设计算法,将给定二叉树的叶子结点连成一个带头结点的单链表,并要求叶子结点按照从左到右的顺序插入,而排列顺序为从右到左(逆置)的单链表。
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 100
typedef char Elemtype;
typedef struct tNode
{
Elemtype data;
struct tNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef struct node
{
Elemtype data;
struct node *next;
}StackNode, *LinkStack;
LinkStack push(LinkStack top, Elemtype x)
{
StackNode *s;
s = (StackNode*)malloc(sizeof(StackNode));
s->data = x;
s->next = top; top = s; //新结点插入链表
return top;
}
LinkStack top = NULL;
BiTNode *createtree()
{
BiTNode *T;
char str;
str = getchar();
if (str == '#')
return NULL;
else
{
T = (BiTNode*)malloc(sizeof(BiTNode));
T->data = str;
T->lchild = createtree();
T->rchild = createtree();
return T;
}
}
void OutputLinkstack(LinkStack top)
{
StackNode *s;
s = top;
while (s != NULL)
{
cout << s->data << " ";
s = s->next;
}
cout << endl;
}
void preorder(BiTNode *bt, LinkStack &top)
{
if (bt == NULL)
return;
if (bt->rchild == NULL && bt->lchild == NULL)
top=push(top, bt->data);
preorder(bt->lchild,top);
preorder(bt->rchild,top);
}
void main()
{
LinkStack top = NULL;
BiTNode *bt;
cout << "创建二叉树" << endl;
cout << "请以先序序列输入节点的值,为空时输入'#':" << endl;
bt = createtree();
cout << "二叉树的叶子结点置逆链表为:" << endl;
preorder(bt, top);
OutputLinkstack(top);
cout << endl;
system("pause");
}
测试二叉树:
结果: