计算二叉树的深度

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的深度。
输入格式:

输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。

输出格式:

输出为一个整数,即该二叉树的高度。

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出样例:

5

#include<iostream>
#include<stdlib.h>
int flag=0;
using namespace std;
typedef struct node
{
    struct node *left;
    struct node *right;
    char data;
}Node;
Node *binarytree(char a[],char b[],int len)
{
    int i;
    if (len==0)
    return NULL;
    Node *p;
    p=(Node *)malloc(sizeof(Node));
    p->data=a[0];
    for (i=0;i<len;i++)
    {
        if (b[i]==a[0])
        break;
    }
    p->left=binarytree(a+1,b,i);
    p->right=binarytree(a+i+1,b+i+1,len-1-i);
    return p;
}
用一个judge函数来判断他的深度,当深度大于当前找到的最大深度时,更改最大深度。
void judge(Node *p,int level)
{
    if (p==NULL)
    return ;
    if (level>flag)
    flag=level;
    if (p->left!=NULL)
    judge(p->left,level+1);
    if (p->right!=NULL)
    judge(p->right,level+1);
}
int main()
{
    int i,n;
    cin>>n;
    char pre[n],mid[n];
    for (i=0;i<n;i++)
    cin>>pre[i];
    for (i=0;i<n;i++)
    cin>>mid[i];
    Node *tree;
    tree=(Node *)malloc(sizeof(Node));
    tree=binarytree(pre,mid,n);
    judge(tree,1);
    cout<<flag;
}
### 计算二叉树深度的算法实 计算二叉树深度可以采用递归或非递归的方法。以下是两种方法的具体实及解释。 #### 1. 递归算法 递归算法的核心思想是从根节点开始,分别递归地计算左子树右子树的深度,然后取两者中的较大值并加1,即为当前树的深度。 以下是递归算法的代码实: ```c int GetTreeDepth(BiTree T) { int depth1 = 0, depth2 = 0; if (T == NULL) { return 0; } else { depth1 = GetTreeDepth(T->lchild); // 递归计算左子树深度 depth2 = GetTreeDepth(T->rchild); // 递归计算右子树深度 if (depth1 > depth2) { return depth1 + 1; // 左子树更深,则返回左子树深度加1 } else { return depth2 + 1; // 右子树更深,则返回右子树深度加1 } } } ``` 上述代码中,`BiTree` 是二叉树节点的结构体类型[^3]。 #### 2. 非递归算法 非递归算法通常使用队列来实层次遍历。通过记录每一层的最后一个节点位置,可以在遍历过程中统计树的深度。 以下是非递归算法的代码实: ```c #define MAX_NODE 1000 // 定义队列的最大容量 int Search_Depth(BiTree *T) { BiTree *Queue[MAX_NODE]; // 定义队列 BiTree *p = T; int front = 0, rear = 0, depth = 0, levelLoc; if (T != NULL) { Queue[++rear] = p; // 根节点入队 levelLoc = rear; // 根节点是第1层的最后一个节点 } while (front < rear) { // 当队列不为空时 p = Queue[++front]; // 出队 if (p->Lchild != NULL) { Queue[++rear] = p->Lchild; // 左子节点入队 } if (p->Rchild != NULL) { Queue[++rear] = p->Rchild; // 右子节点入队 } if (front == levelLoc) { // 如果访问到当前层的最后一个节点 depth++; // 深度加1 levelLoc = rear; // 更新下一层最后一个节点的位置 } } return depth; } ``` 在非递归算法中,使用队列模拟层次遍历的过程,并通过记录每层最后一个节点的位置来计算树的深度[^5]。 #### 总结 - **递归算法**:简单直观,但可能会因为递归层数过深而导致栈溢出。 - **非递归算法**:适合处理大规模数据,避免了递归带来的额外开销。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值