已知非满置二叉树的结点数,怎么求二叉树的深度?(最后一行以上的结点都是满置的)急!!写出程序,谢谢

已知非满置二叉树的结点数,怎么求二叉树的深度?(最后一行以上的结点都是满置的)急!!写出程序,谢谢,第1张

#include<stdioh>
void main()
{
int i,a[15],t;
printf("输入要建树的节点数:\n ");
scanf("%d",&t);
printf("按层输入各节点:\n");
for(i=1;i<=t;i++)
scanf("%d",&a[i]);
if (t>=2&&t<=3)
printf("深度为 2");
else if (t>=4&&t<=7)
printf("深度为 3");
else if (t>=8&&t<=15)
printf("深度为 4");
}

这个式子中的log(2)是指求以10为底2的对数,log(JIEDIAN)/log(2)算的是以2为底,JIEDIAN的对数,前面加(int)相当于下取整,把小数部分去掉,这个式求的是JIEDIAN个结点的数的最低高度

#include <stdioh>

#include <stdlibh>

#include <malloch>

typedef struct Node

{

char data;

Nodeleft_tree;

Noderight_tree;

}RootNode;

RootNodeCreateBinTree() //创建二叉树

{

char ch;

scanf("%c",&ch);

if (ch==',')

{

return NULL;

}

RootNodet=(Node)malloc(sizeof(Node));

t->data=ch;

t->left_tree=CreateBinTree();

t->right_tree=CreateBinTree();

return t;

}

void InTraBinTree(RootNodeT) //中序遍历二叉树

{

if (NULL!=T->left_tree)

{

InTraBinTree(T->left_tree);

}

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

if (NULL!=T->right_tree)

{

InTraBinTree(T->right_tree);

}

}

void PoTraBinTree(RootNodeT) //后序遍历二叉树

{

if (NULL!=T->left_tree)

{

InTraBinTree(T->left_tree);

}

if (NULL!=T->right_tree)

{

InTraBinTree(T->right_tree);

}

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

}

int GetLeavesCounts(RootNodeT) //获得叶子结点个数

{

int counts=0; //记录叶子结点个数

if (NULL==T->left_tree && NULL==T->right_tree)

{

return 1;

}

if (NULL!=T->left_tree)

{

counts+=GetLeavesCounts(T->left_tree);

}

if (NULL!=T->right_tree)

{

counts+=GetLeavesCounts(T->right_tree);

}

return counts;

}

int GetBinTreeDeep(RootNodeT) //获得二叉树深度

{

if (NULL==T->left_tree && NULL==T->right_tree)

{

return 1;

}

int left_deep=0,right_deep=0;

if (NULL!=T->left_tree)

{

left_deep=GetBinTreeDeep(T->left_tree); //获得左子树的深度

}

if (NULL!=T->right_tree)

{

right_deep=GetBinTreeDeep(T->right_tree); //获得右子树的深度

}

if (left_deep>right_deep)

{

return left_deep+1;

}

return right_deep+1;

}

void DestroyBinTree(RootNodeT) //销毁二叉树

{

if (NULL==T->left_tree && NULL==T->right_tree)

{

free(T);

return;

}

if (NULL!=T->left_tree)

{

DestroyBinTree(T->left_tree);

}

if (NULL!=T->right_tree)

{

DestroyBinTree(T->right_tree);

}

free(T);

}

void main()

{

system("color 0a");

printf("输入一个长度小于50个字符的字符串:");

RootNodeBinTree=CreateBinTree(); //创建二叉树

InTraBinTree(BinTree); //中序遍历

printf("\n");

PoTraBinTree(BinTree); //后序遍历

printf("\n");

printf("%d\n",GetLeavesCounts(BinTree)); //输出叶子结点个数

printf("%d\n",GetBinTreeDeep(BinTree)); //输出二叉树深度

DestroyBinTree(BinTree); //销毁二叉树

system("pause");

}

专门为你编的,若还有疑问请加QQ:2609135351

先遍历二叉树的左子树的深度,然后再遍历二叉树右子树的深度。最后判断左子树和右子树的深度,如果左子树比右子树深则返回左子树深度+1,否则返回右子树深度+1。

算法如下:

/ 初始条件: 二叉树T存在。 *** 作结果: 返回T的深度 /
int BiTreeDepth(BiTree T)
{
 int i,j;
    if(!T)
  return 0;
 if(T->lchild)
  i=BiTreeDepth(T->lchild); // 左子树深度
 else
  i=0;
 if(T->rchild)
  j=BiTreeDepth(T->rchild);  // 右子树深度
 else
  j=0;
 return i>ji+1:j+1;
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13169971.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-15
下一篇 2023-06-15

发表评论

登录后才能评论

评论列表(0条)

保存