用c语言求树的高度(数据结构)

题目描述

一棵树有n个节点,其中1号节点为根节点。

输入格式

第一行是整数n,表示节点数
后面若干行,每行两个整数a b,表示b是a的子节点。

输出

求这棵树的高度(根节点为第1层)

样例输入
5
1 2
1 3
3 4
3 5
样例输出
3

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int data;
    struct node *next;
}Link;

void insertNode(Link *head, int data) {
    Link *p = head;
    Link *q = (Link *)malloc(sizeof(Link));
    q->data = data;
    q->next = NULL;
    while(p->next != NULL) p=p->next;
    p->next = q;
}
void freeNode(Link *head) {
    Link *p = head->next;
    Link *q;
    head->next = NULL;
    while(p != NULL){
        q = p;
        p=p->next;
        free(q);
    }
}

int deep(Link ** tree, int start) {
    int depth = 1;
    Link *p;
    if(tree[start]->next == NULL) {
        return depth;
    }
    p= tree[start]->next;
    while(p!= NULL){
        int tmp = deep(tree, p->data - 1);
        if(tmp > depth) depth = tmp;
        p=p->next;
    }

    return depth + 1;
}

int main(){
    int count, i;
    int a, b;
    Link **tree;
    
    scanf("%d", &count);
    tree = (Link **)malloc(sizeof(Link*)*count);
    for(i=0;i<count;++i) {
        tree[i] = (Link *)malloc(sizeof(Link));
        tree[i]->next = NULL;
    }
    while((scanf("%d%d",&a, &b))!=EOF){
        if(a>0 && b>0) {
            insertNode(tree[a-1], b);
        }
    }
    printf("%d\n", deep(tree, 0));
    for(i=0;i<count;++i) {
        freeNode(tree[i]);
        free(tree[i]);
    }
    free(tree);
    return 0;
}

追问

亲,能详细说明一下你的代码吗?我是新手对链表不是特别熟

追答

tree[i],i=0-n放父节点,它后面的链表放每个直接子节点,例如1 2
1 3

tree[0]放的是1,它后面的链表放的是2和3

算法就是 从1开始递归查找每个子节点的树高,取最大值,

温馨提示:内容为网友见解,仅供参考
无其他回答

用c语言求树的高度(数据结构)
= NULL){ q = p; p=p->next; free(q); }}int deep(Link ** tree, int start) { int depth = 1; Link *p; if(tree[start]->next == NULL) { return depth; } p= tree[start]->next; while(p!= NULL){ int tmp = deep(tree, p->...

设树采用孩子兄弟表示法存放,用类C语言设计算法计算树的高度。
采用递归求解,先求左子树的高度和右子树的高度,然后整棵树的高度就是两颗子树高度的最大值+1。假定叶子节点高度为0。代码如下:struct node { int val; struct node* left; struct node* right;};int height(struct node* root){ int h, lh, rh; if ( root == NULL) ...

树(Tree) - 数据结构
树的基本构造树是一种特殊的无环连通图,由节点构成。主要节点类型包括:根节点、子节点,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。树的高度定义为从根节点到最远叶子节点的节点数,如图中所示,树的高度为3。树的遍历方式不同于列表,树的遍历需采用特定方法。主要有层次遍历(BF...

C语言题(C++也行):树的直径(tree)求程序,急!
《数据结构》里面有标准答案。

数据结构创建一棵树的c语言代码怎么写?
define ERROR 0 define OVERFLOW -2 typedef char TElemType;typedef int Status;typedef struct BiTNode { \/\/ 结点结构 TElemType data;struct BiTNode *lchild, *rchild;\/\/ 左右孩子指针 } BiTNode, *BiTree;\/\/以下是建立二叉树存储结构,空节点输入作为#结束标识 Status CreateBiTree(BiTree &T...

一份C语言的数据结构题目,急求答案
{BiTree pp;int tag;}s[100];int top; Bitree p;top=0; p=t;while(p!=NULL&&p->p!=NULL){while(p!=NULL&&p->data!=x){top++;s[top].pp=p;s[top].tag=0;p=p->lchild;} if(p!=NULL&&p->data==x){for(i=1; i<=top; i++)printf(s[i].pp->data);} else if(...

树高度是什么意思?
树高度可以通过递归算法进行计算。对于一个节点,其高度等于其子树高度的最大值再加一。通过使用递归算法,可以依次从每个节点开始计算子树高度,并在计算过程中记录最大值。代码实现上,可以使用类似以下的Java递归算法:public int height(TreeNode root) { if (root == null) { return 0; } int ...

以二叉链表为存储结构,写出求二叉树高度和宽度的算法
树的高度:对非空二叉树,其深度等于左子树的最大深度加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,让...

求数据结构树与二叉树转换C语言代码
一切具有层次关系的问题都可用树来描述。一、树的概述 树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前趋。以下具体地给出树的定义及树的数据结构表示。(一)树的定义 树是由一个或多个结点组成的有限集合,其中:⒈必有一个特定的称为根(...

数据结构,关于树的深度问题
高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;这是来自维基百科的定义。虽然其他书有不同的定义,还是建议以参考书为准——没标注的话默认0。维基百科 -树(数据结构)https:\/\/zh.wikipedia.org\/wiki\/%E6%A0%91_(%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%...

相似回答