(1)建立含有n个结点的二叉树链表; (2)按照先序、中序、后序遍历的顺序依次输出二叉树的各个结点。
以下是程序代码,里面还包括求树的深度和叶子,已经运行通过了。
#include
#include
#include
#define Max 20 //结点的最大个数
typedef struct node{
char data;
struct node *lchild;
struct node *rchild;
}BTNode; //自定义二叉树的结点类型
typedef BTNode *BTree; //定义二叉树的指针
int NodeNum,leaf; //NodeNUm为结点数,leaf为叶子数
BTree CreatBTree(void)
{BTree T;
char ch;
if((ch=getchar())=='#')
return(NULL); //读入#,返回空指针
else{
T=(BTNode *)malloc(sizeof(BTNode));//生成结点
T->data=ch;
T->lchild=CreatBTree();//构造左子树
T->rchild=CreatBTree();//构造右子树
return(T);
}
}
void Preorder(BTree T) //先序遍历
{
if(T){
printf("%c",T->data);//访问结点
Preorder(T->lchild);//先序遍历左子树
Preorder(T->rchild);//先序遍历右子树
}
}
void Inorder(BTree T)//中序遍历
{
if(T)
{
Inorder(T->lchild);//中序遍历左子树
printf("%c",T->data);//访问结点
Inorder(T->rchild);//中序遍历右字树
}
}
void Postorder(BTree T)//后序遍历
{
if(T)
{
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
}
}
int TreeDepth(BTree T)//后序遍历求二叉树的深度,结点数和叶子数
{
int hl,hr,max;
if(T)
{
hl=TreeDepth(T->lchild);//求左深度
hr=TreeDepth(T->rchild);//求右深度
max=hl>hr?hl:hr;//取左右深度的最大值
NodeNum=NodeNum+1;//求结点数
if(hl==0&&hr==0)
leaf=leaf+1;
return(max+1);
}
else return(0);
}
void Levelorder(BTree T)//层次遍历二叉树
{
int front=0,rear=1;
BTNode *cq[Max],*p;//定义结点的指针数组cq
cq[1]=T;//根入队
while(front!=rear)
{
front=(front+1)%NodeNum;
p=cq[front];//出队
printf("%c",p->data);//出队,输出结点的值
if(p->lchild!=NULL)
{rear=(rear+1)%NodeNum;
cq[rear]=p->rchild;//右子树入队
}
}
}
void main()
{
BTree root;
int i,depth;
printf("
");
printf("创建二叉树,请输入完全二叉树的先序序列,用#代表虚结点:");
root=CreatBTree();//返回根结点
do{
printf("********************SELECT********************
");
printf("1:先序遍历
");
printf("2:中序遍历
");
printf("3:后序遍历
");
printf("4:深度、结点数、叶子数
");
printf("5:层次遍历
");
printf("备注:选择层次遍历之前,需要先选择4,求出该树的结点数。");
printf("0:Exit
");
printf("*********************************************
");
scanf("%d",&i);//输入菜单序号
switch(i)
{
case 1:printf("先序遍历结果为:");
Preorder(root);
break;
case 2:printf("中序遍历结果为:");
Inorder(root);
break;
case 3:printf("后序遍历结果为:");
Postorder(root);
break;
case 4:depth=TreeDepth(root);
printf("深度=%d 结点数=%d",depth,NodeNum);
printf("叶子数=%d",leaf);
break;
case 5:printf("层次遍历为:");
Levelorder(root);
break;
default:exit(1);
}
printf("
");
}
while(i!=0);
}
#include <stdlib.h>
typedef char Elem;
typedef struct Node
{
Elem data;
struct Node *pLchild;
struct Node *pRchild;
}BTreeNode, *BTree;
BTree CreateBTree(BTree T)//创建二叉树
{
Elem x;
scanf("%c", &x);
if ('0' == x)
{
T = NULL;
}
else
{
T = (BTree) malloc (sizeof(BTreeNode));
T->data = x;
T->pLchild = CreateBTree(T->pLchild);
T->pRchild = CreateBTree(T->pRchild);
}
return T;
}
void PostTraverseBTree(BTree T)//后序
{
if (NULL != T)
{
PostTraverseBTree(T->pLchild);
PostTraverseBTree(T->pRchild);
printf("%c ", T->data);
}
}
void InTraverseBTree(BTree T)//中序
{
if (NULL != T)
{
InTraverseBTree(T->pLchild);
printf("%c ", T->data);
InTraverseBTree(T->pRchild);
}
}
void PreTraverseBTree(BTree T)//前序
{
if (NULL != T)
{
printf("%c ", T->data);
PreTraverseBTree(T->pLchild);
PreTraverseBTree(T->pRchild);
}
}
int main(void)
{
BTree T = NULL;
printf("请输入二叉树元素:\n");
T = CreateBTree(T);
printf("\n\n");
printf("先序遍历:\n");
PreTraverseBTree(T);
printf("\n\n");
printf("中序遍历:\n");
InTraverseBTree(T);
printf("\n\n");
printf("后序遍历:\n");
PostTraverseBTree(T);
printf("\n\n");
}
如下面的二叉树:(无左右孩子输入0)
A
B C
D E F G
则输入:ABCD00E00F00G00回车
n个节点的完全二叉树顺序存储在一维数组a中,设计一个算法由此数组得到该...
完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最...
C++:对于一棵有n个结点的完全二叉树,其深度为 ();若对其结点按层进行编...
如果根结点的层次为1,则:n个结点的完全二叉树,深度为下取整[log2n] + 1或者上取整[log2(n+ 1)],具体过程差不多所有的数据结构的教科书上都有,利用的是二叉树的性质推出的 i的双亲编号为下取整[i\/2],左孩子编号2i,右孩子编号2i + 1 所有这些用数学归纳法都可以证明的 ...
一棵含有n个结点的k叉树,可能达到的最大深度和最小深度各为多少?_百 ...
最大深度为n+k-1(因为若最大深度是为n个节点的单支树,则该树有可能不是k叉树了,这不符合k叉树的定义了,当k为1时,最大深度才为n,所以最大深度为n+k-1才具有普遍意义!)最小深度为以k为底(n*(k-1)+1)的对数,并对该对数向上取整。
数据结构作业(C语言版的)牛人知道一下哈 不胜感激
\/***\/ include "stdio.h"include "stdlib.h"define NULL 0 define TRUE 1 define FALSE 0 typedef struct LNode{ int data;struct LNode *next;}LNode,*Linklist;\/*创建一个带头结点含有n个结点的单链表*\/
证明含有n个结点的二叉链表中共有n+1个空链域
可以这样考虑,链域一共有2*n个,(每个点有两个鲢鱼),对于除了根节点以外的每个点都是有一个父亲节点,所以一共有n-1个指针指向某个节点,形成n-1个有东西的链域(减1即是父亲节点)所以一共有2*n-(n-1)=n+1个链域没有指向任何东西 参考资料:本人大脑 ...
用链表(llink-rlink)存储包含n个结点的二叉树时,结点的2n个指针区域中...
2、这个是平衡二叉树的定义,不是普通二叉树的要求 8、正确 2、设根结点的深度为1 深度为6的满二叉树只有最下一层是叶子,也就是有2^5=32个叶子,相应地,分支都是度为2的结点,有2^5-1 = 31 个
小世界网络模型的NW小世界模型构造算法
1、一个环状的规则网络开始:网络含有N个结点,每个结点向与它最临近K个结点连出K条边,并满足N>>K>>ln(N)>>1。2、随机化加边:以概率p在随机选取的一对节点之间加上一条边。其中,任意两个不同节点之间至多只能有一条边,并且每一个节点都不能有边与自身相连。改变p值可以实现从最临近耦合...
证明具有n个结点的二叉树,其深度至少为[log2n]+1,求详细证明?
证明:设所求完全二叉树的深度为k,根据完全二叉树的定义和性质2可知,k-1层满二叉树的结点个数为n时,有 2k-1-1<n≤2k-1;即 2k-1≤n<2k;对不等式取对数,有 k-1≤log2n<k;由于k是整数,所以具有n个结点的二叉树,其深度至少为[log2n]+1。
具有n个结点的二叉树中,一共有___[填空1]___个指针域,其中只有___[填 ...
1、共有n+1个空指针域。2、邻接矩阵中1的个数除以2 A[i][j]是否为1 计算该行中1的个数。3、邻接表中有2m个节点。4、最坏的平均查找长度为 :(n+1)\/2最好的平均查找长度:O(log(n))。5、比较的次数为 n*(n-1)\/2。6、15个节点。
一个包含n个分支节点(非叶节点)的非空二叉树,它的叶节点数目最多为...
其中ni表示度为i的节点数量。由二叉树的性质有 n0 = n2 + 1 (2)故有 n1 + n0 - 1 = n (3)n0 = n + 1 - n1 (4)当n1 = 0时,n0有最大值 n + 1 即一个包含n个分支节点(非叶节点)的非空二叉树,它的叶节点数目最多为 n + 1 ...
调治血塞: #include #define max 100typedef struct node{ //二叉树结构...
德江县13211771749: (1)建立含有n个结点的二叉树链表; (2)按照先序、中序、后序遍历的顺序依次输出二叉树的各个结点. - ?
调治血塞: #include <stdio.h>#include <stdlib.h> typedef char Elem; typedef struct Node { Elem data; struct Node *pLchild; struct Node *pRchild; }BTreeNode, *BTree; BTree CreateBTree(BTree T)//创建二叉树 { Elem x; scanf("%c", &x); if ('0' == x) { T = NULL;...
德江县13211771749: 创建含有n个结点的单循环链表 - ?
调治血塞: #include"stdio.h" #include"iostream.h" #include"malloc.h" typedef int elementype; typedef struct node { elementype data; struct node *next; }node,*linklist; int initlink(linklist l) { int n; linklist p ,q; q=(node*)malloc(sizeof(node)); if(!q) { cout<<"...
德江县13211771749: C语言二叉树的二叉链表 - ?
调治血塞: #include <stdio.h>#include <stdlib.h>#include<malloc.h> typedef struct node { char data; struct node *lchild; struct node *rchild; }tnode; tnode *createtree() { tnode *t; char ch; ch=getchar(); if(ch=='0') t=NULL; else { t=(tnode *)malloc(sizeof(tnode)); t->...
德江县13211771749: 用C语言编程(对二叉树的操作) - ?
调治血塞: struct bitree { int value; bitree left; bitree right; } void bianli(bitree bt) { cout《《bt.value; banli(bt.left); bianli(bt.right); }
德江县13211771749: 用C语言编写:建立一棵以二叉链表结构存储的二叉树,并对其进行遍历.求该二叉树中的结点个数等操作. - ?
调治血塞: 存储结构 typedef struct { int weight; int parent, lchild, rchild; } HTNode ,*HuffmanTree; // 动态分配数组存储huffman树 算法设计 void createHuffmantree(){ ht=(HuffmanTree)malloc(m+1)*sizeof(HTNode);// 动态分配数组存储huffman树,0号单元未用// m:huffman 树中的结点数(m=2*n-1)
德江县13211771749: 二叉树的链式存储结构的数据结构定义、创建、先序和后序遍历,并将结果序列输出. - ?
调治血塞: 1、建立一个单链表,并从屏幕显示单链表元素列表.2、从键盘输入一个数,查找在以上创建的单链表中是否存在该数;如果存在,显示它的位置;如果不存在,给出相应提示.3、在上述的单链表中的指定位置插入指定的元素4、删除上述...
德江县13211771749: 数据结构的题 帮忙下 谢谢1、具有n个节点的二叉树采用二叉链表存储结构 共有________个空指针域.2、对于n的顶点的无向图,采用邻接矩阵表示,求图... - ?
调治血塞:[答案] 1. n+1 2. 邻接矩阵中1的个数除以2 A[i][j]是否为1 计算该行中1的个数 3. 2m 4. (n+1)/2 O(log(n)) 5. n*(n-1)/2 6. 15
德江县13211771749: 数据结构,完全二叉树问题(用C语言) - ?
调治血塞: #include #include typedef struct node { int elem; struct node *lch,*rch; }Bnode; Bnode *creat() { Bnode *root =NULL; Bnode *s[20]; int i,x; int j; printf("input i and x:"); scanf("%d,%d",&i,&x); while(i != 0) { Bnode *p = (Bnode *)malloc(sizeof(Bnode...
德江县13211771749: 二叉树的建立 - ?
调治血塞: #define NULL 0 #include "stdio.h" #include "stdlib.h"//二叉链表结点定义 struct tree {int data;struct tree *lchild;struct tree *rchild; };// 先序建立二叉树 struct tree *create(struct tree *BT,int k) {struct tree *p;int x;p=(struct tree *)malloc(...