ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

9-二叉树简单实现

2022-01-25 22:05:06  阅读:172  来源: 互联网

标签:lChild struct 实现 myBinaryTree 二叉树 简单 rChild NULL 节点


笔记

多叉树转换成二叉树:左孩子右兄弟

从根节点、左下方开始,节点左侧放自己左侧的孩子,右侧放自己右侧的兄弟。

二叉树

满二叉树

一颗深度为k且有(2的k次方减1)个节点

完全二叉树

除最后一层外,每一层上的节点数均达到最大值;在最后一层只缺少右边的若干节点。

示意图

遍历

先序遍历:根 左 右(遍历顺序)

中序遍历:左 根 右

后序遍历:左 右 根

要实现的接口
遍历、叶子的数量、树的高度(层数)、拷贝

在接口实现时,一般使用递归来遍历树。

二叉树中每个节点都有左孩子节点和右孩子节点(可能为NULL),函数的参数是一个节点的指针,函数内将参数做根节点使用,函数内调用递归时,传入自身的孩子节点,则相当于下一层的调用会将自身的孩子节点当作根节点,层层递归。从宏观上,就是树一层一层的遍历。

代码

start0.c

#include<stdio.h>
#include<stdlib.h>

//树的节点
struct myBinaryTree{
    char ch;  //数据域
    struct myBinaryTree* lChild;
    struct myBinaryTree* rChild;
};

//遍历打印
//利用递归,先序遍历:根 左 右
void foreachPrint(struct myBinaryTree* b){
    if(NULL == b){
        return;
    }

    //这三条语句的顺序,决定了树的遍历顺序
    //这里的遍历顺序是根、左、右
    printf("%c  ",b->ch); //打印,可以换成其他的处理函数
    foreachPrint(b->lChild);
    foreachPrint(b->rChild);
}

//叶子数量
//左右都为null的节点称为叶子
void getLeaf(struct myBinaryTree* b,int* nums){
    if(NULL == b){
        return;
    }

    if(NULL==b->lChild && NULL==b->rChild){
        (*nums)++;
    }

    getLeaf(b->lChild, nums);
    getLeaf(b->rChild, nums);
}

//树的高度(层数)
int getHeight(struct myBinaryTree* b){
    if(NULL == b){
        return 0;
    }

    int lheight = getHeight(b->lChild);
    int rheight = getHeight(b->rChild);

    return lheight>rheight ? lheight+1 : rheight+1;
}

//拷贝树(但是作用域还是之前数据的)
struct myBinaryTree* copyBinaryTree(struct myBinaryTree* b){
    if(NULL == b){
        return NULL;
    }

    struct myBinaryTree* lChild = copyBinaryTree(b->lChild);
    struct myBinaryTree* rChild = copyBinaryTree(b->rChild);

    struct myBinaryTree* newNode = malloc(sizeof(struct myBinaryTree));

    newNode->lChild = lChild;
    newNode->rChild = rChild;
    newNode->ch = b->ch;

    return newNode;
}

//释放树
void freeBinaryTree(struct myBinaryTree* b){
    if(NULL == b){
        return;
    }

    freeBinaryTree(b->lChild);
    freeBinaryTree(b->rChild);

    free(b);
}

int main(){
    struct myBinaryTree* newBt = NULL;

    struct myBinaryTree bt1 = {'A',NULL,NULL};
    struct myBinaryTree bt2 = {'B',NULL,NULL};
    struct myBinaryTree bt3 = {'C',NULL,NULL};
    struct myBinaryTree bt4 = {'D',NULL,NULL};
    struct myBinaryTree bt5 = {'E',NULL,NULL};
    struct myBinaryTree bt6 = {'F',NULL,NULL};
    struct myBinaryTree bt7 = {'G',NULL,NULL};
    struct myBinaryTree bt8 = {'H',NULL,NULL};

    //按照顺序将节点连接起来
    bt1.lChild = &bt2;
    bt1.rChild = &bt6;

    bt2.rChild = &bt3;

    bt3.lChild = &bt4;
    bt3.rChild = &bt5;

    bt6.rChild = &bt7;
    bt7.lChild = &bt8;

    foreachPrint(&bt1);
    printf("\n");

    int leafnums = 0;
    getLeaf(&bt1, &leafnums);
    printf("leaf nums=%d\n",leafnums);

    printf("tree height=%d\n",getHeight(&bt1));

    newBt = copyBinaryTree(&bt1);

    printf("-----------------\n");
    foreachPrint(newBt);
    printf("\n");

    leafnums = 0;
    getLeaf(newBt, &leafnums);
    printf("leaf nums=%d\n",leafnums);

    printf("tree height=%d\n",getHeight(newBt));

    return 0;
}

标签:lChild,struct,实现,myBinaryTree,二叉树,简单,rChild,NULL,节点
来源: https://www.cnblogs.com/TaXueWuYun/p/15844152.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有