IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树的建立与遍历 -> 正文阅读

[数据结构与算法]二叉树的建立与遍历

二叉树的建立与遍历

//二叉树的建立
 int i,h;    
    //根节点,右遍头节点,左边头节点,右边普通节点,左边普通节点,右边叶子,左边叶子
    tree *father,*rightson,*leftson,*right_node,*left_node,*left_node_son,*right_node_son;
    father=(tree*)malloc(sizeof(tree));//创建根节点
    rightson=(tree*)malloc(sizeof(tree));//创建右遍头节点
    leftson=(tree*)malloc(sizeof(tree));//创建左边头节点
    father->p=0;
    printf("tree!\n");
    printf("input size=:");//输入树的大小
    scanf("%d",&father->data);//把树的大小存入根节点数据域
    if (father->data>MAXSIZE){//错误处理,输入大于最大长度
        printf("ERROR!");
        return ERROR;//返回错误
    }
    for (i = 0;i < father->data; i++){
        right_node=(tree*)malloc(sizeof(tree));//创建右遍的树枝
        right_node->data=i;//赋值
        right_node_son=(tree*)malloc(sizeof(tree));//创建一个叶子
        right_node_son->data=i+1;//给叶子赋值
        right_node->right=right_node_son;//树枝的右指针指向叶子 
        right_node->left=rightson;//指向树枝的下一个节点
        rightson=right_node;
    }
    i=0;
    for (i = 0; i <father->data; i++){
        left_node=(tree*)malloc(sizeof(tree));//创建左边树枝
        left_node->data=i+3;//赋值
        left_node_son=(tree*)malloc(sizeof(tree));//创建一个叶子
        left_node_son->data=i+2;//给叶子赋值
        left_node->left=left_node_son;//树枝的左边指针指向叶子
        left_node->right=leftson;//指向树枝的下一个节点
        leftson=left_node;
    } 

首先创建出根节点与两边的尾节点。然后读取二叉树的深度,并存于二叉树的根节点的数据域中。之后通过一个for循环来读取输入,并创建新的节点加入到树上。第一次输入读取输入到树枝节点的数据域,第二次输入读取到树叶节点的数据域。然后树枝节点指向叶子节点,下一步树枝节点指向下一个树枝节点,进行下一次输入操作。

树的形状

树的形状

树的遍历

代码片:

int preorderoutput(tree *pre_father){  
    printf("print!\n");
    pre_father->p++;//用变量p来结束递归
    if (pre_father->p<5){        
        printf("left=%d\n",pre_father->left->data);//输出
        pre_father->left=pre_father->left->left;//指针指向下一个节点
        preorderoutput(pre_father);//递归
    }
    else if (pre_father->p>=5 && pre_father->p<10){
        printf("right=%d\n",pre_father->right->data);//输出
        pre_father->right=pre_father->right->right;//指针指向下一个节点        
        preorderoutput(pre_father);//递归
    }
    return OK;
}
//递归法输出叶子
int print_son(tree *son_father){
    printf("print!\n");
    son_father->p++;
    if (son_father->p>=10 && son_father->p<15){
        printf("leftson=%d\n",son_father->left->right->data);//输出
        son_father->left=son_father->left->left;//树枝向下
        son_father->left->right=son_father->left->right;//指向新的叶子
        print_son(son_father);
    }
    else if(son_father->p>=15 && son_father->p<20){
        printf("rightson=%d\n",son_father->right->left->data);//输出
        son_father->right=son_father->right->right;//树枝向下
        son_father->right->left=son_father->right->left;//指向新的叶子
    }
    return OK;

方向是有左到右,先输出树枝,在输出叶子。采用了递归的方法。

函数 preorderoutput :在p的值0-5间时,输出左侧树枝,指针以此指向下一个树枝节点。在5-10间则输出右侧树枝,指针依次指向下一个树枝节点。

函数 print_son :输出叶子。在p的值在10-15之间,遍历左侧树枝,因为在建立树时已经将树枝节点指向叶子节点,所以可以直接重新赋值叶子节点,来输出叶子的数据域。算是一个不足之处因为想要输出叶子还要在重新从根节点遍历,浪费了额外的时间与空间,影响力算法的效率,所以还需改进!!!

github源码
我的博客

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 16:00:39  更:2021-09-20 16:01:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:19:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码