数据结构|二叉树的一些题|C语言

82 阅读2分钟

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;
}