求数据结构 用键盘输入一个字符串,按照满二叉树的特点生成一颗二叉树。要求用递归方法生成二叉树

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求数据结构 用键盘输入一个字符串,按照满二叉树的特点生成一颗二叉树。要求用递归方法生成二叉树相关的知识,希望对你有一定的参考价值。

参考技术A #include <stdio.h>
#include<malloc.h>
typedef struct node //二叉树结点类型的定义

char data;
struct node *lchild; //定义结点的左孩子指针
struct node *rchild; //定义结点的右孩子指针
BinTNode; BinTNode *CreateBinTree() //输入二叉树的先序遍历序列,创建二叉链表

BinTNode *t;
char ch;
ch=getchar();
if (ch=='0') //如果读入0,创建空树
t=NULL;
else

t=(BinTNode *)malloc(sizeof(BinTNode)); //申请根结点*t空间
t->data=ch; //将结点数据ch放入跟结点的数据域
t->lchild=CreateBinTree(); //建左子树
t->rchild=CreateBinTree(); //建右子树

return t;
void ListBinTree(BinTNode *t) //用广义表表示二叉树

if (t!=NULL)

printf("%c",t->data);
if (t->lchild!=NULL||t->rchild!=NULL)

printf("(");
ListBinTree(t->lchild);
if (t->rchild!=NULL)
printf(",");
ListBinTree(t->rchild);
printf(")");


void main()

BinTNode *t=NULL;
printf("请输入先序序列,虚结点用0表示(以图6.12(a)二叉树为例):\n");
t=CreateBinTree();
printf("广义表表示的二叉树的输出:\n");
ListBinTree(t);
printf("\n");
程序运行结果:
请输入先序序列,虚结点用0表示(以图6.12(a)二叉树为例):
ABC00DE00F000(回车)
广义表表示的二叉树的输出:
A ( B ( C,D (E ,F)))

二叉树_顺序存储

参考技术A

满二叉树 (Full Binary Tree)
所有分支结点都有存在左子树和右子树,并且所有叶子结点都在同一层上。
完全二叉树 (Complete Binary Tree)
如果一棵具有n个结点的二叉树与满二叉树的前n个结点的结构相同,则称这棵二叉树为完全二叉树。

重要性质
对于一棵有n个结点的 完全二叉树 的结点按照从上至下和从左至右的顺序对所有结点从零开始到 n-1 进行顺序编号,则对于序号为i的结点(0≤i≤n),有:
(1)如果 i=0,则结点i是二叉树的根;如果i>0,则其 双亲 是结点 (i-1)/2 (整除)。
(2)如果2i+1≥n,则结点i无左孩子;否则,其 左孩子 是结点 2i+1
(3)如果2i+2≥n,则结点i无右孩子;否则,其 右孩子 是结点 2i+2

根据上面两点,得到二叉树顺序存储的实现:

定义:

获取双亲节点下标:

左子节点下标:

右子节点下标:

主函数测试:

总结:
1、对于完全二叉树或接近于完全的二叉树,用顺序存储可以省空间简化操作;否则,都不适宜用顺序存储。
2、顺序存储结构通病:必须预先给出数组的存储空间大小MaxSize。

以上是关于求数据结构 用键盘输入一个字符串,按照满二叉树的特点生成一颗二叉树。要求用递归方法生成二叉树的主要内容,如果未能解决你的问题,请参考以下文章

找一个Java程序:关于二叉树的建立和排序

算法题0009 | 求完全二叉树结点个数

二叉树_顺序存储

完全二叉树与满二叉树的区别是啥?

满二叉树的循环递归

数据结构之二叉树