求算法:怎样用一个算法判断一个二叉树是否为正则二叉树?

怎样用一个算法判断一个二叉树是否为正则二叉树?
怎样写一个算法求二叉树的内部路径长度,内部路径长度指的是从根结点到每一个结点的长度之和!

送高分!
...全文
1243 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaoyan2005 2005-10-12
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4194/4194953.xml?temp=.445672
  • 打赏
  • 举报
回复
有N×N个元素(N=2m)构成的二维阵列,将其转换成一个四叉树表示,转换原则如下:

将阵列4等分为四个子区域,做为四叉树的四个分支,若该子区域所有元素值均为0或均为1,则对应的四叉树为叶子结点,填值为1或0;若该子区域值不一致,则对该区域可再划分,形成下一层的子树,递归重复,直到每个子区域对应相应叶结点或到达元素这一级为止。

要求:写出从二维阵列转换生成四叉树的算法基本思路,再给出从二维阵列转换生成四叉树的算法。[7分]
兄弟,知道怎样求二叉树的内部路径长度的算法的,内部路径长度就是从根结点到所有结点的长度之和!我看你的给我回答的求一个兄弟孩子存放的二叉树算法不错,可否帮个忙,求二叉树的内部路径长度
 A
  /\
B C
/
D
/
E
这棵二叉树的内部路径长度应是:1+2+3+1,A--B,A--D,A--E,A--C的长度分别是:1,2,3,1
懂了吗?
谁答对了,再送50分,我问了好长时间,就是没有人答对,伤心呀!
  • 打赏
  • 举报
回复
怎样用一个算法判断一个二叉树是否为正则二叉树?
怎样写一个算法求二叉树的内部路径长度,内部路径长度指的是从根结点到每一个结点的长度之和!

  • 打赏
  • 举报
回复
谢谢楼上
请看西北大学考研试题中的几个算法?
1。已知一棵二叉树采用二叉链表存放,写一算法,要求统计出二叉树中叶子结点个数并输出二叉树中非终端结点(输出无顺序要求)
2、编写算法,判断带头结点的双循环链表L是否对称。
对称是指:设各元素值a1,a2,......,an,则有ai=an-i+1,即指:a1=an,a2=an-1,...,
结点结构如下:prior data next
3、已知(k1,k2,...,kn)是堆,试写一算法,在O(n)时间内将(k1,k2,...,kn,kn+1)调整为堆。
jhqjhq 2005-08-10
  • 打赏
  • 举报
回复
转贴:



二叉树的基本运算实验

【问题描述】

二叉树采用二叉链表作存储结构,试编程实现二叉树的如下基本操作:

1. 按先序序列构造一棵二叉链表表示的二叉树T;

2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历序列,分别输出结点的遍历序列;

3. 求二叉树的深度/结点数目/叶结点数目;

4.将二叉树每个结点的左右子树交换位置。

【数据描述】

//- - - - - - 二叉树的二叉链表存储表示 - - - - - - -

typedef struct BiTNode{

TElemType data;

Struct BiTNode * lchild, * rchild; //左右孩子指针

}BiTNode, * BiTree;

【算法描述】

1. 建立一棵二叉树

Status CreateBiTree(BiTree &T)

//按先序次序输入二叉树中结点的值(一个字符),#字符表示空树,

//构造二叉链表表示的二叉树T。

scanf(&ch);

if (ch=='#') T=NULL;

else {

if (!(T=(BiTNode *) malloc(sizeof(BiTNode)))) exit (OVERFLOW);

T->data = ch; //生成根结点

CreateBiTree(T->lchild); //生成左子树

CreateBiTree(T->rchild); //生成右子树

}

return OK;

}//CreateBiTree

2. 先序遍历二叉树递归算法

Status PreOrderTraverse(BiTree T,Status(* Visit)(TElemType e)){

//采用二叉链表存储结构,Visit是对数据元素操作的应用函数,

//先序遍历二叉树T,对每个结点调用函数Visit一次且仅一次。

//一旦visit()失败,则操作失败。

if (T){

if (Visit(T->data))

if (PreOrderTraverse(T->rchild,Visit)) return OK;

return ERROR;

}else return OK;

}// PreOrderTraverse

3. 中序遍历的递归算法

Status InOrderTraverse(BiTree T,Status(* Visit)(TElemType e)){

if (T){

if (Visit(T->data))

if (InOrderTraverse(T->rchild,Visit)) return OK;

return ERROR;

}else return OK;

}// InOrderTraverse

4. 后序遍历递归算法

Status PostOrderTraverse(BiTree T,Status(* Visit)(TElemType e)){

if (T){

if (Visit(T->data))

if (PreOrderTraverse(T->rchild,Visit)) return OK;

return ERROR;

}else return OK;

}// PreOrderTraverse

5. 中序遍历非递归算法之一

Status InOrderTraverse(BiTree T, Status (* Visit)(TElemType e)) {

InitStack(S);

Push(S,T); //根指针进栈

While (!StackEmpty(S)) {

While (GetTop(S,p) && p) Push(S,p->lchild); //向左走到尽头

Pop(S,p); //空指针退栈

If (!StackEmpty(S)) { //访问结点,向右一步

Pop(S,p);

If (!Visit(p->data)) return ERROR;

Push(S,p->rchild);

}//if

}//while

return OK;

}//InOrderTraverse

6. 中序遍历非递归算法之二

Status InOrderTraverse(BiTree T, Status (* Visit)(TElemType e)) {

//采用二叉链表存储结构,Visit是对数据元素操作的应用函数。

//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit。

InitStack(S);

p=T;

While (p‖!StackEmpty(S)) {

if (p) {Push(S,p); p=p->lchild;} //根指针进栈,遍历左子树

else { //根指针退栈,访问根结点,遍历右子树

Pop(S,p);

if (!Visit(p->data)) return ERROR;

p=p->rchild);

}//else

}//while

return OK;

}//InOrderTraverse

7. 层次遍历二叉树的非递归算法

Status LevelOrder(BiTree T){

//按层次遍历二叉树T, Q为队列

InitQueue(Q);

If (T!=NULL){// 若树非空

EnQueue(Q,T);//根结点入队列

While (!QueueEmpty(Q)){

DeQueue(Q,b); //队首元素出队列

Visit(b->data); //访问结点

If (b->lchild!=NULL) EnQueue(Q,b->lchild);//左子树非空,则入队列

If (b->rchold!=Null) EnQueue(Q,b->rchild);//右子树非空,则入队列

}//while

}//if

}LevelOrder

8. 求二叉树的深度

int depth(BiTree T){

//若T为空树,则深度为0,否则其深度等于左子树或右子树的最大深度加1

if (T==NULL) return 0;

else {dep1=depth(T->lchild);

dep2=depth(T->rchild);

return dep1>dep2?dep1+1:dep2+1;

}

}

【C源程序】

#include <stdio.h>

#include <stdlib.h>

#define MAX 20

#define NULL 0

typedef char TElemType;

typedef int Status;

typedef struct BiTNode{

TElemType data;

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

Status CreateBiTree(BiTree *T){

char ch;

ch=getchar();

if (ch=='#') (*T)=NULL; /* #代表空指针*/

else {

(*T)=(BiTree) malloc(sizeof(BiTNode));/*申请结点 */

(*T)->data=ch; /*生成根结点 */

CreateBiTree(&(*T)->lchild) ; /*构造左子树 */

CreateBiTree(&(*T)->rchild) ; /*构造右子树 */

}

return 1;

}

void PreOrder(BiTree T){

if (T) {

printf("%2c",T->data); /*访问根结点,此处简化为输出根结点的数据值*/

PreOrder(T->lchild); /*先序遍历左子树*/

PreOrder(T->rchild); /*先序遍历右子树*/

}

}

void LevleOrder(BiTree T){

/*层次遍历二叉树T,从第一层开始,每层从左到右*/

BiTree Queue[MAX],b; /*用一维数组表示队列,front和rear分别表示队首和队尾指针*/

int front,rear;

front=rear=0;

if (T) /*若树非空*/

{Queue[rear++]=T; /*根结点入队列*/

while (front!=rear){ /*当队列非空*/

b=Queue[front++];   /*队首元素出队列,并访问这个结点*/

printf("%2c",b->data);

if (b->lchild!=NULL) Queue[rear++]=b->lchild; /*左子树非空,则入队列*/

if (b->rchild!=NULL) Queue[rear++]=b->rchild; /*右子树非空,则入队列*/

}

}

}//LevelOrder

int depth(BiTree T){ /*求二叉树的深度*/

int dep1,dep2;

if (T==NULL) return 0;

else {dep1=depth(T->lchild);

dep2=depth(T->rchild);

return dep1>dep2?dep1+1:dep2+1;

}

}//depth

main(){

BiTree T=NULL;

printf("\nCreate a Binary Tree\n");

CreateBiTree(&T); /*建立一棵二叉树T*/

printf("\nThe preorder is:\n");

PreOrder(T); /*先序遍历二叉树*/

printf("\nThe level order is:\n");

LevleOrder(T); /*层次遍历二叉树*/

printf("\nThe depth is:%d\n",depth(T));

}

【测试数据】

1. 输入:#↙,建立一棵空树,

先序遍历和层次遍历没有输出,树的深度输出为0;

2. 输入:A↙

先序和层次遍历输出均为A;

深度输出为:1

3. 输入:ABC##DE#G##F###↙,

先序输出为: A B C D E G F

层次遍历输出为:A B C D E F G

深度输出为: 5

4. 图 6-6

建立如图6-6所示二叉树,

输入:     ABD#GJ##K##E##C#FH##IL###↙,

先序遍历输出为:A B D G J K E C F H I J

层次遍历输出为:A B C D E F G H I J K L

深度输出为: 5



【说明】
1.按先序次序输入二叉树中结点的值,用'#'表示空树,对每一个结点应当确定其左右子树的值(为空时必须用特定的空字符占位),故执行此程序时,最好先在纸上画出你想建立的二叉树,每个结点的左右子树必须确定,若为空,则用特定字符标出,然后再按先序输入这棵二叉树的字符序列;

2.为了简化程序的书写量,以及程序的清晰性,对结点的访问以一条输出语句表示,若有更复杂的或多种访问,可以将结点的访问编写成函数,然后通过函数指针进行函数的调用。读者若有兴趣,可自行编写。

3.C语言函数参数传递,都是“传值”的方式,故在设计函数时,必须注意参数的传递,若想通过函数修改实际参数的值,必须对指针变量作参数。具体设计时,读者一定要把指针变量、指针变量指向的值等概念弄清楚;
jhqjhq 2005-08-10
  • 打赏
  • 举报
回复
1。根据深度和节点数的关系就可以判断是否为 正则二叉树 。设深度 为i,则节点为2的i次方-1

2。不懂! 估计要和先序遍历相关
  • 打赏
  • 举报
回复
另外怎样判断二叉树是正则二叉树,正则二叉树是指树中没有子树为1的结点!

2,142

社区成员

发帖
与我相关
我的任务
社区描述
它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。
社区管理员
  • 地理信息系统
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧