本文主要介绍二叉树的基本操作,包括代码实现。
所有操作基于下方的二叉树:
1、二叉树的存储结构定义:
typedef struct BiTNode {
int data;
struct BiTNode *lchild,*rchild;
} BiTNode;
typedef BiTNode *BiTree;
2、二叉树的创建:
// 先序创建二叉树
int createBiTree(BiTree &T) {
int x;
scanf("%d",&x);
if(x == -1) return 1;
BiTNode *p = (BiTNode *)malloc(sizeof(BiTNode));
p->data = x;
p->rchild = p->lchild = NULL;
// 将当前节点作为根节点向下递归建树
T = p;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
3、二叉树的遍历:
// 先序遍历
int preOrder(BiTree T) {
if(T == NULL) return 1;
printf("%d ",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
// 中序遍历
int midOrder(BiTree T) {
if(T == NULL) return 1;
midOrder(T->lchild);
printf("%d ",T->data);
midOrder(T->rchild);
}
// 后序遍历
int afterOrder(BiTree T) {
if(T == NULL) return 1;
afterOrder(T->lchild);
afterOrder(T->rchild);
printf("%d ",T->data);
}
4、二叉树节点个数:
// 二叉树结点个数
int ans = 0; // 用一个全局变量来记录二叉树结点个数
void nodeNum(BiTree root) {
if(root == NULL) return ;
ans ++;
nodeNum(root->lchild);
nodeNum(root->rchild);
return ;
}
5、二叉树叶子节点个数:
// 二叉树叶子结点个数
int res = 0; // 用一个全局变量来记录二叉树叶子节点个数
void leafNum(BiTree root) {
if(root == NULL) return ;
if(root->lchild == NULL && root->rchild == NULL) {
res ++;
return ;
}
leafNum(root->lchild);
leafNum(root->rchild);
return ;
}
6、二叉树的深度:
// 二叉树的最大深度
int maxDeep(BiTree root) {
if(root == NULL) return 0;
int leftDeep = maxDeep(root->lchild),rightDeep = maxDeep(root->rchild);
if(leftDeep > rightDeep) {
return 1 + leftDeep;
} else {
return 1 + rightDeep;
}
return 0;
}
7、完整代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode {
int data;
struct BiTNode *lchild,*rchild;
} BiTNode;
typedef BiTNode *BiTree;
// 先序创建二叉树
int createBiTree(BiTree &T) {
int x;
scanf("%d",&x);
if(x == -1) return 1;
BiTNode *p = (BiTNode *)malloc(sizeof(BiTNode));
p->data = x;
p->rchild = p->lchild = NULL;
// 将当前节点作为根节点向下递归建树
T = p;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
// 先序遍历
int preOrder(BiTree T) {
if(T == NULL) return 1;
printf("%d ",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
// 中序遍历
int midOrder(BiTree T) {
if(T == NULL) return 1;
midOrder(T->lchild);
printf("%d ",T->data);
midOrder(T->rchild);
}
// 后序遍历
int afterOrder(BiTree T) {
if(T == NULL) return 1;
afterOrder(T->lchild);
afterOrder(T->rchild);
printf("%d ",T->data);
}
// 二叉树结点个数
int ans = 0; // 用一个全局变量来记录二叉树结点个数
void nodeNum(BiTree root) {
if(root == NULL) return ;
ans ++;
nodeNum(root->lchild);
nodeNum(root->rchild);
return ;
}
// 二叉树叶子结点个数
int res = 0; // 用一个全局变量来记录二叉树叶子节点个数
void leafNum(BiTree root) {
if(root == NULL) return ;
if(root->lchild == NULL && root->rchild == NULL) {
res ++;
return ;
}
leafNum(root->lchild);
leafNum(root->rchild);
return ;
}
// 二叉树的最大深度
int maxDeep(BiTree root) {
if(root == NULL) return 0;
int leftDeep = maxDeep(root->lchild),rightDeep = maxDeep(root->rchild);
if(leftDeep > rightDeep) {
return 1 + leftDeep;
} else {
return 1 + rightDeep;
}
return 0;
}
int main() {
BiTree tree;
createBiTree(tree);
printf("先序遍历:");
preOrder(tree);
printf("\n");
printf("中序遍历:");
midOrder(tree);
printf("\n");
printf("后序遍历:");
afterOrder(tree);
printf("\n");
nodeNum(tree);
printf("二叉树节点个数是:%d\n",ans);
res = 0;
leafNum(tree);
printf("二叉树叶子节点个数是:%d\n",res);
int deep = maxDeep(tree);
printf("二叉树的最大深度是:%d\n",deep);
return 0;
}
8、测试样例:
/*
4
1
-1
3
-1
-1
6
9
-1
-1
7
5
-1
-1
-1
*/
9、测试结果:
你的支持是我的最大动力,不要忘了点赞支持一下噢~~~。