使用c语言 采用二叉链表存储二叉树,并对二叉树进行如下操作:建立一棵二叉树;三种方式遍 历二叉树;求二叉树的深度;输出二叉树所有结点的个数;输出二叉树所有叶子结点的个 数。 要求写出各个算法相应的实现程序。
时间: 2023-11-14 15:18:48 浏览: 109
以下是使用C语言采用二叉链表存储二叉树的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
// 建立二叉树
void createBiTree(BiTree *T) {
int data;
scanf("%d", &data);
if (data == -1) {
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = data;
createBiTree(&((*T)->lchild));
createBiTree(&((*T)->rchild));
}
}
// 递归方式前序遍历
void preOrderTraversalRecursion(BiTree T) {
if (T) {
printf("%d ", T->data);
preOrderTraversalRecursion(T->lchild);
preOrderTraversalRecursion(T->rchild);
}
}
// 非递归方式前序遍历
void preOrderTraversal(BiTree T) {
BiTree stack[100];
int top = -1;
BiTree p = T;
while (p || top != -1) {
while (p) {
printf("%d ", p->data);
stack[++top] = p;
p = p->lchild;
}
if (top != -1) {
p = stack[top--];
p = p->rchild;
}
}
}
// 递归方式中序遍历
void inOrderTraversalRecursion(BiTree T) {
if (T) {
inOrderTraversalRecursion(T->lchild);
printf("%d ", T->data);
inOrderTraversalRecursion(T->rchild);
}
}
// 非递归方式中序遍历
void inOrderTraversal(BiTree T) {
BiTree stack[100];
int top = -1;
BiTree p = T;
while (p || top != -1) {
while (p) {
stack[++top] = p;
p = p->lchild;
}
if (top != -1) {
p = stack[top--];
printf("%d ", p->data);
p = p->rchild;
}
}
}
// 递归方式后序遍历
void postOrderTraversalRecursion(BiTree T) {
if (T) {
postOrderTraversalRecursion(T->lchild);
postOrderTraversalRecursion(T->rchild);
printf("%d ", T->data);
}
}
// 非递归方式后序遍历
void postOrderTraversal(BiTree T) {
BiTree stack[100];
int top = -1;
BiTree p = T, r = NULL;
while (p || top != -1) {
while (p) {
stack[++top] = p;
p = p->lchild;
}
p = stack[top];
if (p->rchild && p->rchild != r) {
p = p->rchild;
stack[++top] = p;
p = p->lchild;
} else {
printf("%d ", p->data);
r = p;
top--;
p = NULL;
}
}
}
// 求二叉树的深度
int getDepth(BiTree T) {
if (!T) return 0;
int leftDepth = getDepth(T->lchild);
int rightDepth = getDepth(T->rchild);
return (leftDepth > rightDepth) ? (leftDepth + 1) : (rightDepth + 1);
}
// 输出二叉树所有结点的个数
int getNodeCount(BiTree T) {
if (!T) return 0;
return getNodeCount(T->lchild) + getNodeCount(T->rchild) + 1;
}
// 输出二叉树所有叶子结点的个数
int getLeafCount(BiTree T) {
if (!T) return 0;
if (!T->lchild && !T->rchild) return 1;
return getLeafCount(T->lchild) + getLeafCount(T->rchild);
}
int main() {
BiTree T = NULL;
printf("请输入二叉树的结点元素,-1表示空结点\n");
createBiTree(&T);
printf("递归方式前序遍历:");
preOrderTraversalRecursion(T);
printf("\n非递归方式前序遍历:");
preOrderTraversal(T);
printf("\n递归方式中序遍历:");
inOrderTraversalRecursion(T);
printf("\n非递归方式中序遍历:");
inOrderTraversal(T);
printf("\n递归方式后序遍历:");
postOrderTraversalRecursion(T);
printf("\n非递归方式后序遍历:");
postOrderTraversal(T);
printf("\n二叉树的深度:%d", getDepth(T));
printf("\n二叉树所有结点的个数:%d", getNodeCount(T));
printf("\n二叉树所有叶子结点的个数:%d", getLeafCount(T));
return 0;
}
```
阅读全文