树与二叉树的转换与遍历

树的初始化函数(双亲法和孩子结点法两种),

建树函数,

输出树函数,

树的前序遍历函数(递归和非递归两种),

树的后序遍历函数(递归和非递归两种),

树的层次遍历函数,

一般树和二叉树的转换函数。

主菜单和副菜单。

主函数。

具体代码如下:

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

//设置常量:

#define MAX_TREE_SIZE 100

//一般树的存储结构有以下几种:双亲结点,孩子结点,孩子兄弟结点。本实验运用到的是双亲结点和孩子兄弟结点。具体存储结构如下:

/*树的双亲表示结点结构定义*/

typedef struct

{

int data;

int parent;        //双亲位置域

}PTNode;

/*双亲表示法树结构*/

typedef struct

{

PTNode node[MAX_TREE_SIZE];

int count;        //根的位置和节点个数

}PTree;

/*树的孩子兄弟表示结点结构定义*/

typedef struct node{

int data;

struct node *firstchild;

struct node *rightsib;

}BTNode,*BTree;

 

//初始化树(双亲表示法)

void init_ptree(PTree *tree)

{

tree->count=-1;

}

//初始化树结点(孩子兄弟表示法)

BTNode GetTreeNode(int x)

{

BTNode t;

t.data=x;

t.firstchild=t.rightsib=NULL;

return t;

}

//树的前序遍历(递归)

void preorder(BTNode *T)

{

if(T!=NULL)

{

printf("%d ",T->data);

preorder(T->firstchild);

preorder(T->rightsib);

}

}

//树的前序遍历(非递归)

void preorder2(PTree T)

{

int i;

for(i=0;i<T.count;i++)

{

printf("%d ",T.node[i]);

}

}

//树后序遍历(递归)

void inoeder(BTNode *T)

{

if(T!=NULL)

{

inoeder(T->firstchild);

printf("%d ",T->data);

inoeder(T->rightsib);

}

}

//树后序遍历(非递归)

void inoeder2(PTree T)

{

int i;

for(i=T.count-1;i>=0;i--)

{

printf("%d ",T.node[i]);

}

}

//层次遍历

void level(PTree T)

{

int i;

for(i=0;i<T.count;i++)

{

printf("%d ",T.node[i]);

}

}

//水平输出二叉树

void PrintBTree(BTNode *root,int level)

{

int i;

if(root!=NULL)

{

PrintBTree(root->rightsib,level+1);

for(i=1;i<=8*level;i++)

printf(" ");

printf("-------%d\n",root->data);

PrintBTree(root->firstchild,level+1);

}

}

//输出树

void print_ptree(PTree tree)

{

int i;

printf("    序号    结点    双亲\n");

for(i=0;i<=tree.count;i++)

{

printf("%8d%8d%8d",i,tree.node[i].data,tree.node[i].parent);

printf("\n");

}

}

/*用双亲表示法创建树*/

PTree CreatTree(PTree T)

{

int i=1;

int fa,ch;

PTNode p;

for(i=1;ch!=-1;i++)

{

printf("输入第%d结点:\n",i);

scanf("%d,%d",&fa,&ch);

printf("\n");

p.data=ch;

p.parent=fa;

T.count++;

T.node[T.count].data = p.data;

T.node[T.count].parent = p.parent;

}

printf("\n");

printf("创建的树具体情况如下:\n");

print_ptree(T);

return T;

}

/*一般树转换成二叉树*/

BTNode *change(PTree T)

{

int i,j=0;

BTNode p[MAX_TREE_SIZE];

BTNode *ip,*is,*ir,*Tree;

ip=(BTNode *)malloc(sizeof(BTNode));

is=(BTNode *)malloc(sizeof(BTNode));

ir=(BTNode *)malloc(sizeof(BTNode));

Tree=(BTNode *)malloc(sizeof(BTNode));

for(i=0;i<T.count;i++)

{

p[i]=GetTreeNode(T.node[i].data);

}

for(i=1;i<T.count;i++)

{

ip=&p[i];

is=&p[j];

while(T.node[i].parent!=is->data)

{

j++;

is=&p[j];

}

if(!(is->firstchild))

{

is->firstchild=ip;

ir=ip;

}

else

{

ir->rightsib=ip;

ir=ip;

}

}

Tree=&p[0];

return Tree;

}

/*主菜单*/

void Menu()

{

printf("=================主菜单=======================\n");

printf("***输入1-------------以双亲法创建一棵一般树***\n");

printf("***输入2-------------树的前序遍历(递归)*******\n");

printf("***输入3-------------树的后序遍历(递归)*******\n");

printf("***输入4-------------树的前序遍历(非递归)*****\n");

printf("***输入5-------------树的后序遍历(非递归)*****\n");

printf("***输入6-------------层次序的非递归遍历*******\n");

printf("***输入0-------------退出程序*****************\n");

printf("==============================================\n");

printf("请输入执行的指令:");

}

/*副菜单*/

void Menu2()

{

printf("*****************副菜单*******************\n");

printf("***9-------------返回主菜单继续操作*******\n");

printf("***0-------------退出程序*****************\n");

}

/*主函数*/

void main()

{

int i=0,c1,c2;

PTree T;

BTNode *Tree;

init_ptree(&T);

loop:

Menu();

scanf("%d",&c1);

switch(c1)

{

case  1:

printf("建立一般树,依次输入各个结点情况:\n");

printf("输入结点方式:双亲数据,整型数据(第一个结点双亲数据为-1,最后以-1,-1结束)\n例子:-1,1  1,3\n");

T=CreatTree(T);

Tree=change(T);

printf("一般树转换成二叉树后的情况:\n");

PrintBTree(Tree,i);

getchar();

break;

case  2:

printf("树的前序遍历(递归):\n");

preorder(Tree);

printf("\n");

break;

case  3:

printf("树的后序遍历(递归):\n");

inoeder(Tree);

printf("\n");

break;

case  4:

printf("树的前序遍历(非递归):\n");

preorder2(T);

printf("\n");

break;

case  5:

printf("树的后序遍历(非递归):\n");

inoeder2(T);

printf("\n");

break;

case  6:

printf("树的层次遍历:\n");

level(T);

printf("\n");

break;

case  0:

exit(1);

break;

}

Menu2();

scanf("%d",&c2);

if(c2==9)

goto loop;

else if(c2==0)

exit(1);

}

时间: 2024-07-31 14:33:48

树与二叉树的转换与遍历的相关文章

树与二叉树的转换

将树转换为二叉树的步骤如下: 1加线:所有兄弟节点之间加线 2去线:保留树中每个结点与它第一个孩子的连线,删除其与其他孩子的连线 3层次调整:以根结点为轴心,将整棵树旋转,使之层次分明. 而将二叉树转换为树,正好是一个相逆的过程. 当以二叉链表做树的存储结构时,树的线序遍历和后续遍历完全可以借用二叉树的先序遍历和中序遍历的算法来实现.这其实也证实,我们找到了对树这种复杂问题的简单解决方法.

树——通用树到二叉树的转换

1,已经创建了通用树结构,有必要创建另一种树结构吗? 2,简化树就直接减少结点中孩子的数量,但是这样树还能通用吗? 3,通用树结构的回顾: 1,双亲孩子表示法: 1,每个结点都有一个指向双亲的指针: 2,每个结点都有若干个指向其孩子的指针: 4,另一种树结构模型: 1,孩子兄弟表示法: 1,每个结点都有一个指向其第一个孩子的指针: 2,每个结点都有一个指向其第一个右兄弟的指针: 1,孩子兄弟表示法可以描述普通的树型结构,因为通过根结点可以访问到这一个树形结构的每一个结点: 5,孩子兄弟表示法的特

树 森林与二叉树的转换

1.树.森林为什么向二叉树转换? 因为在实际的处理问题中,大多数情况都是一对多,就向树.森林这样的数据结构! 而对于二叉树我们已经很熟悉了,所以转向我们所熟悉的结构,好处理. 2.孩子兄弟树的方法 把握左孩子右兄弟的原则: (1).树与二叉树的转换:i>以树的根结点为二叉树的根节点: ii>左孩子指针指向该根节点的第一个子结点: iii>右孩子指针指向"兄弟结点" (2).二叉树表示森林:i>二叉树的根结点是森林中第一棵树的根结点 ii>根结点的右孩子为森

树与森林的存储、遍历和树与森林的转换

树的存储结构 双亲表示法 孩子表示法: (a)多重链表(链表中每个指针指向一棵子树的根结点); (b)把每个跟结点的孩子结点排列起来,看成一个线性表,且以单链表做存储结构.且N个头指针也组成一个线性表. 孩子兄弟表示法://二叉树表示法或二叉链表表示法 以二叉链表做树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点(fchild 和nsibling) //孩子兄弟表示法 typedef struct CSNode{ int data; CSNode *fchild

LintCode(72)中序遍历和后序遍历树构造二叉树

题目 中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 /  \ 1    3 分析 递归解决. Python代码 """ Definition of TreeNode: class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None "&q

树和二叉树

以下的内容做为学习笔记,复制别人的,感觉总结的比较好: 第5章 树和二叉树 本章中主要介绍下列内容:  1.树的定义和存储结构  2.二叉树的定义.性质.存储结构  3.二叉树的遍历.线索算法  4.树和二叉树的转换  5.哈夫曼树及其应用课时分配:     1.2两个学时,3四个学时,4两个学时, 5两个学时,上机两个学时重点.难点:     二叉树的遍历.线索算法.哈夫曼树及其应用 第一节 树 1.树的定义和基本运算1.1 定义    树是一种常用的非线性结构.我们可以这样定义:树是n(n≥

数据结构和算法 (二)数据结构基础之树、二叉树

Java面试宝典之二叉树的实现 我们接着上一篇数据结构继续讲解.本章系数据结构之树与二叉树,从这章开始,我们就要介绍非线性结构了,这些内容理解起来比线性表稍难一些,我尽量写的通俗一些,如果读的过程中有任何问题,请按上述方式联系我! 一.树 树 形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树结构在客观世界中是大量存在的,例如家 谱.行政组织机构都可用树形象地表示.树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结

数据结构笔记整理第5章:树和二叉树

第5章 树和二叉树 本章内容 本章主要介绍树.二叉树的概念,遍历方法以及应用等,本章在考研中是重点内容. 5.1 树相关的基本概念 树是一种非线性的数据结构,是若干结点的集合,有唯一的根结点和若干棵互不相交的子树构成.其中每一棵子树又是一棵树,也是由唯一的根结点和若干棵互不相交的子树组成的,由此可知:树的定义是递归的.树的结点数目可以为0,为0的时候是一棵空树. 结点:结点不仅包含数据元素,而且包含指向子树的分支. 结点的度:结点拥有子树的个数或者分支的个数. 树的度:树中各结点度的最大值. 叶

树与二叉树(2)

[toc] 树的存储结构 树的存储结构有两种,线式存储 和 链式存储,灵活使用这两种存储结构,具有如下五种存储方式: 双亲表示法,一种顺序(线式)表示法 孩子表示法,一种链式表示法 孩子链表表示法,结合线式存储和链式存储的混合表示方式 带双亲的孩子链表表示法,结合线式存储和链式存储的混合表示方式 二叉链表(孩子 - 兄弟)存储表示法,一种链式存储方式 双亲表示法 这是一种顺序表示法,使用一维数组存储树中的节点,每个存储单元存储节点的值及其双亲节点在数组中的下标值.下面的树 T 使用双亲表示法存储