1.给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;//左右子树根结点地址
}BiTNode, *BiTree;
void CreateBiTree(BiTree &T) {
int val;
scanf(" %d", &val);
T = (BiTNode*)malloc(sizeof(BiTNode));
if(val == -1)T = NULL;
else {
T->data = val;//生成根节点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
return;
}
int minDepth(BiTree root) {
if(root == NULL) return 0;
int leftheight = minDepth(root->lchild);
int rightheight = minDepth(root->rchild);
if(root->lchild == NULL && root->rchild != NULL) {
return 1 + rightheight;
}
if(root->rchild == NULL && root->lchild != NULL) {
return 1 + leftheight;
}
return 1 + fmin(rightheight, leftheight);
}
int main() {
BiTree T = (BiTNode*)malloc(sizeof(BiTNode));
CreateBiTree(T);
printf("最小深度为:%d", minDepth(T));
return 0;
}
2.二叉树左右孩子交换
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;//左右子树根结点地址
}BiTNode, *BiTree;
//先序创建二叉树
void CreateBiTree(BiTree &T) {
int val;
scanf(" %d", &val);
T = (BiTNode*)malloc(sizeof(BiTNode));
if(val == -1)T = NULL;
else {
T->data = val;//生成根节点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
return;
}
void swapChildren(BiTree root) {
BiTree tmp = (BiTNode*)malloc(sizeof(BiTNode));
tmp = root->lchild;
root->lchild = root->rchild;
root->rchild = tmp;
}
void invertTree(BiTree &root) {
if (root == NULL) {
return;
}
invertTree(root->lchild);//左
invertTree(root->rchild);//右
swapChildren(root);//中
}
//先序遍历
void PreOrderTraverse(BiTree T)
{ if(T)
{ printf("%d ", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
int main() {
BiTree T = (BiTNode*)malloc(sizeof(BiTNode));
CreateBiTree(T);
printf("翻转后:");
invertTree(T);
PreOrderTraverse(T);
return 0;
}
3.设森林采用根节点为T的二叉链表存储,设计非递归算法求森林中有几棵树。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX 100005 // 定义最大值
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;//左右子树根结点地址
}BiTNode, *BiTree;
int c = 0; // 全局变量,用于记录节点数
//先序创建二叉树
void CreateBiTree(BiTree &T) {
int val;
scanf(" %d", &val);
T = (BiTNode*)malloc(sizeof(BiTNode));
if(val == -1)T = NULL;
else {
T->data = val;//生成根节点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
return;
}
// 中序遍历二叉树,统计节点数
//设森林中树的棵数为n, 则右孩子数为n-1,所以算出二叉树的右孩子数即可。
void Traverse(BiTree &T)
{
//T = (BiTNode*)malloc(sizeof(BiTNode));
if(T != NULL) // 如果节点不为空
{
c++; // 计数器加一
Traverse(T->rchild); // 递归遍历右子树
}
}
int main()
{
BiTree T = (BiTNode*)malloc(sizeof(BiTNode));
CreateBiTree(T);
Traverse(T); // 中序遍历二叉树,统计节点数
printf("%d\n", c); // 输出节点数
return 0;
}