6-9 求二叉树高度(20 point(s))

6-9 求二叉树高度(20 point(s))

本题要求给定二叉树的高度。

函数接口定义:

int GetHeight( BinTree BT );

其中BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

要求函数返回给定二叉树BT的高度值。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
int GetHeight( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("%d\n", GetHeight(BT));
    return 0;
}
/* 你的代码将被嵌在这里 */

输出样例(对于图中给出的树):

4

int GetHeight( BinTree BT ){//如果已知左子树高度和右子树高度
                            //树高为max(Lh,Rh)+1,用后续遍历
    int lh,rh;
    if(BT == NULL)return 0;//实际上是一个导致加的过程,到底时为零
                           //通过递归倒着往回加这样返回出去的时候就是树高
    else{
        lh = GetHeight(BT->Left);
        rh = GetHeight(BT->Right);
        return (lh>rh?lh:rh)+1;
    }
}

 
递归算法是一种通过函数自我调用的方式来解决问题的技术。对于二叉树高度计算问题,我们可以利用递归来优雅地解决。 ### 什么是二叉树高度二叉树高度是指从根节点到最远叶子节点的最长路径上的边数。如果树为空,则高度-1;若只有根节点,则高度为 0。 --- ### 使用递归二叉树高度 假设我们有一个 `TreeNode` 类表示二叉树的每个节点: ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; left = null; right = null; } } ``` 以下是递归二叉树高度的步骤: 1. 如果当前节点为空(即到达了空子树),返回高度 `-1`。 2. 分别递归计算左子树和右子树的高度。 3. 取左右子树中较大的高度值,并加 1(加上当前层的高度)作为最终结果。 **伪代码描述:** ```text function getHeight(node): if node == NULL: return -1 左子树高度 = getHeight(左孩子) 右子树高度 = getHeight(右孩子) 返回 max(左子树高度, 右子树高度) + 1 ``` **实际代码示例 (Python 版本):** ```python def get_tree_height(root): if root is None: # 空节点情况 return -1 else: # 计算左、右子树的高度 left_height = get_tree_height(root.left) right_height = get_tree_height(root.right) # 最大者+1即是整棵树的高度 return max(left_height, right_height) + 1 ``` --- ### 示例解释 例如有如下的二叉树结构: ``` A / \ B C / D ``` - 节点D 的高度为 0; - 节点B 的高度为 1 (因为它的最大子树深度为1); - 根节点A 的高度为 2。(从A 到D 经过两步) 所以此树的高度应为 **2**. --- ### 时间复杂度分析 由于每次都要访问每一个节点一次,时间复杂度为 O(n),其中 n 是树中的节点总数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值