博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言描述二叉树的实现及操作(链表实现)
阅读量:5211 次
发布时间:2019-06-14

本文共 3470 字,大约阅读时间需要 11 分钟。

概述

     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树。

  前序遍历:根结点 ---> 左子树 ---> 右子树。

  中序遍历:左子树---> 根结点 ---> 右子树。

  后序遍历:左子树 ---> 右子树 ---> 根结点。

  节点深度:节点ni的深度(depth)为从根到ni的唯一路径的长。根的深度为0。

  节点的高:节点ni的高(height)为从ni到一片树叶的最长路径。所有的树叶(没有儿子节点的节点)的高都为0。一棵树的高等于它的根的高。 

代码实现 

  

//    二叉树的实现(C语言)//    链表,递归实现//    编译环境:visual studio 2017//    操作系统:win8.1#include
#include
#include
typedef char Elementtype; // 定义数据类型,可根据需要自行定制typedef struct TreeNode * Node; // Node相当于struct treeNode *// 定义数节点结构typedef struct TreeNode { Elementtype Element; Node left; // 树节点的左子节点 Node right; // 树节点的右子节点}TREE,*PTREE;// 函数声明void CreatTree(PTREE *); // 树的先序创建函数void PreOrderTree(PTREE ); // 树的前序遍历函数void InOrderTree(PTREE ); // 树的中序遍历void PostOrderTree(PTREE ); // 树的后序遍历void LeafOfTree(PTREE ); // 打印树的叶子节点函数int Get_Leaf_Num(PTREE ); // 获取树叶子节点个数int Get_Height(PTREE ); // 获取树的高度// 主函数int main() { PTREE Root; printf("请先序输入二叉树的节点数据: "); CreatTree(&Root); printf("\n前序遍历结果为:"); PreOrderTree(Root); printf("\n中序遍历结果为:"); InOrderTree(Root); printf("\n后序遍历结果为:"); PostOrderTree(Root); printf("\n打印叶子节点为:"); LeafOfTree(Root); printf("\n叶子节点个数为:%d", Get_Leaf_Num(Root)); printf("\n二叉树的高度为:%d", Get_Height(Root)); printf("\n"); return 0;}// 定义树先序创建函数void CreatTree(PTREE *Root) { char val=0; // 用于下面存放数据 val=getchar(); // 输入数据值 // 如果输入'*',则指向为空 if (val == '*') (*Root) = NULL; // 如果输入非'*',则给数据域赋值 else { (*Root) = (PTREE)malloc(sizeof(TREE)); // 申请内存空间 if ((*Root) == NULL) { printf("创建节点失败,无法分配可用内存..."); exit(-1); } else { (*Root)->Element = val; // 给节点数据域赋值 CreatTree(&(*Root)->left); CreatTree(&(*Root)->right); } } }// 树的前序遍历函数定义void PreOrderTree(PTREE Root) { if (Root == NULL) return; else { putchar(Root->Element); PreOrderTree(Root->left); PreOrderTree(Root->right); }}// 树的中序遍历函数定义void InOrderTree(PTREE Root) { if (Root == NULL) return; else { InOrderTree(Root->left); putchar(Root->Element); InOrderTree(Root->right); }}// 树的后序遍历函数定义void PostOrderTree(PTREE Root) { if (Root==NULL) return ; else{ PostOrderTree(Root->left); PostOrderTree(Root->right); putchar( Root->Element); }}// 打印树的叶子节点函数定义void LeafOfTree(PTREE Tree) { if (Tree == NULL) return ; else { if (Tree->left == NULL&&Tree->right == NULL) putchar(Tree->Element); else { LeafOfTree(Tree->left); LeafOfTree(Tree->right); } } }// 获取树的叶子节点个数函数定义int Get_Leaf_Num(PTREE Tree) { if (Tree == NULL) return 0; if (Tree->left == NULL&&Tree->right == NULL) return 1; //递归整个树的叶子节点个数 = 左子树叶子节点的个数 + 右子树叶子节点的个数 return Get_Leaf_Num(Tree->left) + Get_Leaf_Num(Tree->right);}// 获取树高的函数定义int Get_Height(PTREE Tree) { int Height = 0; if (Tree == NULL) return 0; //树的高度 = max(左子树的高度,右子树的高度) + 1 else { int L_Height = Get_Height(Tree->left); int R_Height = Get_Height(Tree->right); Height = L_Height >= R_Height ? L_Height + 1 : R_Height + 1; } return Height;}

运行结果

转载于:https://www.cnblogs.com/maluning/p/8007221.html

你可能感兴趣的文章
异步等待的 Python 协程
查看>>
物理层(一)
查看>>
Linux内核分析 计算机是如何工作的——by王玥
查看>>
整体二分--BZOJ1901: Zju2112 Dynamic Rankings
查看>>
VC程序禁用提示框
查看>>
Vue 表单
查看>>
CDQ分治,二维数点与三维数点,p1357与p2026与p2027与p2028与p2029
查看>>
构建之法(第二章个人技术和流程)
查看>>
Git:一、简介&安装Git 2.20.1
查看>>
leetcode Set Matrix Zeroes
查看>>
二叉树与数组
查看>>
【转】placement new
查看>>
ref 与out
查看>>
Redis复制
查看>>
阻止控制台程序退出
查看>>
关于运维之故障复盘篇-Case Study
查看>>
html 之 td valign 和 align
查看>>
【LOJ】#2239. 「CQOI2014」危桥
查看>>
项目风险管理
查看>>
基于Bootstrap的Asp.net Mvc 分页的实现
查看>>