基本数据结构——二叉树的建立,遍历,求叶子节点,深度计算

/*
新建立一棵二叉树,遍历,查找树的高度,查找树的叶子节点,和总结点数  然后再计算距离最远的两个节点。
SQ 2014-04-20
*/
#include<stdio.h>
struct Node{
    int data;
    struct Node * left;
    struct Node * right;
};
typedef struct Node Node;

typedef struct Node * tree;


//一 ,新建立一棵树
void creat( tree *p){
    int data;
    scanf("%d",&data);
    if(data == 0){
        *p=NULL;
        return ;
        }
        else {
            *p=(tree)malloc(sizeof(Node));
            (*p)->data = data;
            creat(&((*p)->left));
            creat(&((*p)->right));
        }        
}

//二 遍历整棵树,这里采用的是先序遍历

void show(tree root){
        
    if(root == NULL)
        return ;
    else {
        show(root->left);
        printf("%d--->",root->data);
        show(root->right);
    }
}
//三,查找树的叶子节点(很明显,左右孩子都为空的就是叶子节点)
void find_leaf( tree root){

    if(root  == NULL)
        return ;

    else {
        find_leaf(root->left);
        if(root->left == NULL && root->right == NULL)
            printf("叶子节点是:%d\n",root->data);
        find_leaf(root->right);        
    }
}

//, 查找树的总节点数:是左子树的节点总数 + 1 + 右子树的总节点数

    int  total(tree root){
    
        if(root == NULL)
            return ;
        else return (total(root->left) + 1 + total(root->right));
}



//查找树的高度 :树的深度就是其左、右子树深度的较大值再加1
int max(int a, int b){

    if (a > b ) return a;
    else return b;
}
    
int  high(tree root){
    
    // 没有左子树  ,就算右子树深度 +1
    // 没有右子树  ,就算左子树深度 +1
    // 左右都没有  , 就算 1
    //最后都不为空的话,那么就取较大值 +1
    
    if ( (root->left == NULL) && (root ->right != NULL)  )
        return high(root->right) +1;

    else if((root->left != NULL) &&( root->right == NULL))
        return high(root->left) +1;

    else if((root->left == NULL) && (root->right== NULL))
        return 1;
    
    else return(max(high(root->left) , high(root->right) )  +1);
}


/*计算距离最远的两个节点:1.可能都在根节点的左子树上,2.也可能都在右子树上,3.还有可能是根节点和深度最大的节点。
解法一,1.求出二叉树的所有叶子节点。2.求任意两个叶子节点的第一个祖先节点。3.计算具有祖先-子孙关系的两个节点之间的路径之和。
 ... 待续...

*/

int main(){

    tree root;
    creat(&root); //这里需要更改root,之前的root没有指向,所以要传递&(root)。
    show(root);
    printf("\n");
    find_leaf(root);
    int sum;
    sum =total(root);
    printf("总节点数是:%d\n" ,sum);
    int depth;
    depth = high(root);
    printf("树的深度是:%d\n" ,depth);
    
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值