1. 二叉树的深度及结点最远距离

1. 二叉树的深度及结点最远距离

【问题描述】考研真题:求二叉树的深度及二叉树中最远两个结点的距离。

【输入形式】拓展的前序遍历序列

【输出形式】深度和距离

【样例输入】AB#C##

​

#include <iostream>
#include <cstring>
using namespace std;
struct node
{
    char data;
    node *lc, *rc;
};
node *cre(char a[], int len, int &i)
{
    if (i < len && a[i] != '#')
    {
        node *r = new node;
        r->data = a[i];
        r->lc = cre(a, len, ++i);
        r->rc = cre(a, len, ++i);
        return r;
    }
    else
        return NULL;
}
void getdeep(node *a, int step, int &deep)
{
    if (a)
    {
        deep = max(deep, step);
        getdeep(a->lc, step + 1, deep);
        getdeep(a->rc, step + 1, deep);
    }
}
void getdis(node *t, int &dis)
{
    int deep = 0, step = 1;
    if (t == NULL)
        return;
    getdeep(t->lc, step, deep);
    int lh = deep;
    deep = 0;
    getdeep(t->rc, step, deep);
    int rh = deep;
    if (rh + lh > dis)
        dis = rh + lh;
    if (t->lc)
        getdis(t->lc, dis);
    if (t->rc)
        getdis(t->rc, dis);
}
int main()
{
    char a[100];
    cin >> a;
    int i = 0;
    node *t = cre(a, strlen(a), i);
    int deep = 0, step = 1, dis = 1;
    getdeep(t, step, deep);
    getdis(t, dis);
    cout << deep << " " << dis;
}

[点击并拖拽以移动]
​

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是回答您的问题: 1. 以二叉链表表示二叉树,建立一棵二叉树的算法(算法5.3): 建立一棵二叉树需要使用递归方法,首先需要定义一个二叉树构体: ``` typedef struct BiTNode{ int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; ``` 然后,我们可以编写建立二叉树的递归函数: ``` void CreateBiTree(BiTree *T){ int ch; scanf("%d", &ch); if(ch == -1){ // 如果输入-1,则表示该节点为空 *T = NULL; }else{ *T = (BiTree)malloc(sizeof(BiTNode)); if(!(*T)){ exit(-1); // 内存申请失败 } (*T)->data = ch; // 为该节点赋值 CreateBiTree(&(*T)->lchild); // 递归建立左子树 CreateBiTree(&(*T)->rchild); // 递归建立右子树 } } ``` 2. 输出二叉树的中序遍历果(算法5.1): 中序遍历是指先访问左子树,再访问根节点,最后访问右子树。可以使用递归实现中序遍历: ``` void InOrderTraverse(BiTree T){ if(T){ InOrderTraverse(T->lchild); // 遍历左子树 printf("%d ", T->data); // 输出根节点 InOrderTraverse(T->rchild); // 遍历右子树 } } ``` 3. 输出二叉树的前序遍历果: 前序遍历是指先访问根节点,再访问左子树,最后访问右子树。同样可以使用递归实现: ``` void PreOrderTraverse(BiTree T){ if(T){ printf("%d ", T->data); // 输出根节点 PreOrderTraverse(T->lchild); // 遍历左子树 PreOrderTraverse(T->rchild); // 遍历右子树 } } ``` 4. 输出二叉树的后序遍历果: 后序遍历是指先访问左子树,再访问右子树,最后访问根节点。同样可以使用递归实现: ``` void PostOrderTraverse(BiTree T){ if(T){ PostOrderTraverse(T->lchild); // 遍历左子树 PostOrderTraverse(T->rchild); // 遍历右子树 printf("%d ", T->data); // 输出根节点 } } ``` 5. 计算二叉树深度(算法5.5): 二叉树深度是指从根节点到最叶子节点的距离。可以使用递归求解: ``` int TreeDepth(BiTree T){ int depth = 0; if(T){ int left_depth = TreeDepth(T->lchild); // 求解左子树的深度 int right_depth = TreeDepth(T->rchild); // 求解右子树的深度 depth = 1 + (left_depth > right_depth ? left_depth : right_depth); // 取左右子树深度较大值+1即为整棵二叉树深度 } return depth; } ``` 6. 统计二叉树的叶点个数: 叶点是指没有子节点的节点,可以使用递归统计: ``` int CountLeaves(BiTree T){ if(!T){ // 如果是空树,则叶点个数为0 return 0; }else if(!T->lchild && !T->rchild){ // 如果是叶点,则返回1 return 1; }else{ // 否则继续递归统计左右子树中的叶点个数 return CountLeaves(T->lchild) + CountLeaves(T->rchild); } } ``` 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wrong Ansewer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值