以二叉链表为存储结构,写出求二叉树高度和宽度的算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以二叉链表为存储结构,写出求二叉树高度和宽度的算法相关的知识,希望对你有一定的参考价值。
参考技术A 原题:以二叉链表为存储结构,分别写出求二叉树高度及宽度的算法。所谓宽度是指在二叉树的各层上,具有结点数最多的那一层上的结点总数。
标准答案:
①求树的高度
思想:对非空二叉树,其深度等于左子树的最大深度加1。
Int
Depth(BinTree
*T)
int
dep1,dep2;
if(T==Null)
return(0);
else
dep1=Depth(T->lchild);
dep2=Depth(T->rchild);
if(dep1>dep2)
return(dep1+1);
else
return(dep2+1);
②求树的宽度
思想:按层遍历二叉树,采用一个队列q,让根结点入队列,最后出队列,若有左右子树,则左右子树根结点入队列,如此反复,直到队列为空。
int
Width(BinTree
*T)
int
front=-1,rear=-1;/*
队列初始化*/
int
flag=0,count=0,p;
/*
p用于指向树中层的最右边的结点,标志flag记录层中结点数的最大值。*/if(T!=Null)
rear++;
q[rear]=T;
flag=1;
p=rear;
while(front<p)
front++;
T=q[front];
if(T->lchild!=Null)
rear++;
q[rear]=T->lchild;
count++;
if(T->rchild!=Null)
rear++;
q[rear]=T->rchild;
count++;
if(front==p)
/*
当前层已遍历完毕*/
if(flag<count)
flag=count;
count=0;
p=rear;
/*
p指向下一层最右边的结点*/
/*
endwhile*/
return(flag);
如何在数据结构中,以二叉链表为存储结构,建立一棵二叉树,输出其先序,中序,后序遍历序列,统计其叶子
下面我写的代码:
/* Note:Your choice is C IDE */
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct lbtree
char data;
struct lbtree *lchild,*rchild;
;
struct lbtree *createbtree();
void preorder(struct lbtree *root);
void inorder(struct lbtree *root);
void postorder(struct lbtree *root);
treedepth(struct lbtree *root);
numberofleaf(struct lbtree *root);
main()
struct lbtree *root;
int i;
printf("create a tree\\n");
printf("please input nodes of tree\\n");
root=NULL;
root=createbtree();
if(root==NULL)printf("This is an empty tree!\\n");
else
printf("\\n");
printf("1.The preorder traverse \\n");
printf("2.The inorder traverse \\n");
printf("3.The postorder traverse \\n");
printf(" Please choose a kind of order\\n");
scanf("%d",&i);
switch(i)
case 1:preorder(root);break;
case 2:inorder(root);break;
case 3:postorder(root);break;
default:printf("error!\\n");
printf("\\n The depth of the btree is %d",treedepth(root));
printf("\\n The leafnumber of the btree is %d",numberofleaf(root));
struct lbtree *createbtree()
char ch,t;
struct lbtree *root;
printf("please input the data,'$' is the end.\\n");
scanf("%c",&ch);
scanf("%c",&t);
if(ch=='$')
return(NULL);
else
root=(struct lbtree *)malloc(sizeof(struct lbtree));
root->data=ch;
root->lchild=createbtree();
root->rchild=createbtree();
return(root);
printf("ok!");
void preorder(struct lbtree *root)
if(root)
printf(" %c",root->data);
preorder(root->lchild);
preorder(root->rchild);
void inorder(struct lbtree *root)
if(root)inorder(root->lchild);
printf(" %c",root->data);
inorder(root->rchild);
void postorder(struct lbtree *root)
if(root)
postorder(root->lchild);
postorder(root->rchild);
printf(" %c",root->data);
treedepth(struct lbtree *root)
int depth,dl,dr;
if(!root)depth=0;
else
dl=treedepth(root->lchild);
dr=treedepth(root->rchild);
if(dl>dr)depth=dl+1;
else depth=dr+1;
return(depth);
numberofleaf(struct lbtree *root)
int num=0,num1,num2;
if(root)
if((root->lchild==NULL)&&(root->rchild==NULL))num=1;
else
num1=numberofleaf(root->lchild);
num2=numberofleaf(root->rchild);
num=num1+num2;
return(num);
运行结果如图:
参考技术A #include "stdio.h"#include "malloc.h"
#define ELEMTYPE char
typedef struct BiTNode
ELEMTYPE data;
struct BiTNode *lchild,*rchild;
BiTNode;
BiTNode *bulid() /*建树*/
BiTNode *q;
BiTNode *s[20];
int i,j;
char x;
printf("请按顺序输入二叉树的结点以输入0和*号结束\n");
printf("请输入你要输入的为第几个结点i=\n");
scanf("%d",&i);
printf("请输入你要输入该结点的数为x=");
getchar();
scanf("%c",&x);
while(i!=0&&x!='*')
q=(BiTNode*)malloc(sizeof(BiTNode));
q->data=x;
q->rchild=NULL;
q->lchild=NULL;
s[i]=q;
if(i!=1)
j=i/2;
if(i%2==0)
s[j]->lchild=q;
else
s[j]->rchild=q;
printf("请输入你要输入的为第几个结点x=\n");
scanf("%d",&i);
printf("请输入你要输入该结点的数x=");
getchar();
scanf("%c",&x);
return s[1];
void preoder(BiTNode *bt) /*先序遍历*/
if(bt!=NULL)
printf("%c\n",(bt->data));
preoder(bt->lchild);
preoder(bt->rchild);
void InOrder(BiTNode *bt) /*中序遍历*/
if(bt!=NULL)
InOrder(bt->lchild);
printf("%c\n",bt->data);
InOrder(bt->rchild);
void postOrder(BiTNode *bt) /*后序遍历*/
if(bt!=NULL)
postOrder(bt->lchild);
postOrder(bt->rchild);
printf("%c\n",bt->data);
main()
int a;
BiTNode *bt;
bt=bulid();
k1: printf("需要先序遍历输出请输入1,中序遍历请输入2,后序遍历请输入3,结束输入0:");
scanf("%d",&a);
switch(a)
case(1): preoder(bt); goto k1;
case(2): InOrder(bt); goto k1;
case(3): postOrder(bt); goto k1;
case(0): break;
3本回答被提问者采纳 参考技术B 随便一本数据结构的入门书上都有
以上是关于以二叉链表为存储结构,写出求二叉树高度和宽度的算法的主要内容,如果未能解决你的问题,请参考以下文章
1、创建一棵二叉树,以二叉链表作存储结构,实现先根遍历算法 2、创建一棵二叉树,实现先根遍历算法、中根
数据结构 二叉树 用二叉链链表存储结构 写出删除二叉树所有的叶子节点的算法
假设二叉树以二叉链表作为存储结构,试设计一个计算二叉树叶子结点树的递归算 法 要求用递归算法啊