C语言实现二叉树的基本操作

xiaoxiao2021-02-28  48

二叉树中使用最多的方法就是递归,要能在大脑中想象出函数递归调用的过程。

下面代码实现了二叉树结构体的建立,二叉树的形成,二叉树的遍历,二叉树深度和叶子节点数。

在Dev C++中调试运行通过。

#include <stdio.h> #include <stdlib.h> typedef struct BiTNode{ char data; struct BiTNode *lChild; struct BiTNode *rChild; }BiTNode,*BiTree; //先序创建二叉树 void CreateBiTree(BiTree *T) { char ch; scanf("%c",&ch); getchar();//回车符也算一个字符,将其去掉 if (ch == '#')//如果输入#,表示没有该节点 { *T = NULL; return; } else { *T = (BiTree)malloc(sizeof(BiTNode)); (*T)->data = ch; printf("输入%c的左子节点:",ch); CreateBiTree(&((*T)->lChild)); printf("输入%c的右子节点:",ch); CreateBiTree((&(*T)->rChild)); } return; } //先序遍历二叉树 void PreOrderBiTree(BiTree T) { if (T == NULL) { return; } else { printf("%c ",T->data); PreOrderBiTree(T->lChild); PreOrderBiTree(T->rChild); } } //中序遍历二叉树 void MiddleOrderBiTree(BiTree T) { if (T == NULL) { return; } else { MiddleOrderBiTree(T->lChild); printf("%c ",T->data); MiddleOrderBiTree(T->rChild); } } //后续遍历二叉树 void PostOrderBiTree(BiTree T) { if (T == NULL) { return; } else { PostOrderBiTree(T->lChild); PostOrderBiTree(T->rChild); printf("%c ",T->data); } } //二叉树的深度 int TreeDeep(BiTree T) { int deep = 0; if (T != NULL) { int leftdeep = TreeDeep(T->lChild);//递归求深度 int rightdeep = TreeDeep(T->rChild); deep = leftdeep >= rightdeep?leftdeep+1:rightdeep+1; } return deep; } //叶子节点个数 int LeafCount(BiTree T) { static int count; if (T != NULL) { if (T->lChild == NULL && T->rChild == NULL) { count++; } LeafCount(T->lChild); LeafCount(T->rChild); } return count; } //主函数 int main(int argc,const char *argv[]) { BiTree T; int depth,leafCount = 0; printf("请输入第一个节点的值,#表示没有叶节点:\n"); CreateBiTree(&T); printf("先序遍历二叉树:"); PreOrderBiTree(T); printf("\n"); printf("中序遍历二叉树:"); MiddleOrderBiTree(T); printf("\n"); printf("后续遍历二叉树:"); PostOrderBiTree(T); printf("\n"); depth = TreeDeep(T); printf("树的深度为:%d\n",depth); leafCount = LeafCount(T); printf("叶子节点个数:%d\n",leafCount); return 0; } 结果如图所示。

注意:这里节点中的数据是字符,在输入数据中回车符也被算作一个字符,所以需要用getchar()将其去掉。

转载请注明原文地址: https://www.6miu.com/read-55300.html

最新回复(0)