6-1 求二叉树高度 (20 分)

本文介绍了一种计算二叉树高度的方法,通过递归遍历左子树和右子树,找到最大高度并加一,最终返回二叉树的高度值。代码示例使用了C语言实现。

6-1 求二叉树高度 (20 分)

本题要求给定二叉树的高度。
函数接口定义:

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 )
{
    if(BT==NULL)return 0;
    
    int max;
    max=GetHeight(BT->Left);
    if(max<GetHeight(BT->Right))
        max=GetHeight(BT->Right);
    return max+1;
    
}
<think>好的,用户想了解如何用编程语言实现二叉树高度。我需要先回忆二叉树高度的定义,即树中从根节点到最远叶子节点的最长路径上的节点数。通常用递归方法来实现会比较简洁。首先,递归的基本思路是:二叉树高度等于左子树和右子树中较高的那个高度1。如果节点为空,高度就是0。这应该是一个后序遍历的过程,先处理左右子树,再处理当前节点。然后,我得考虑如何用代码表达这个逻辑。比如在Java中,可以定义一个函数,参数是树节点。如果节点为空,返回0。否则递归计算左子树和右子树的高度,取较大值加1。类似地,Python的实现应该也差不多,结构类似。 可能还需要提到非递归的方法,比如使用层序遍历(BFS),记录层数,直到遍历完所有节点。不过用户主要问的是实现,可能递归方法更符合他们的需。还要注意代码的正确性,比如处理空树的情况,以及递归终止条件是否正确。比如当节点为空时返回0,这样叶子节点的左右子树高度都是0,加上自己就是1,正确。 另外,用户提供的引用中有提到递归的治思想,可以结合这点解释代码的逻辑。比如引用[3]中的例子,计算节点个数也是用递归,左右子树处理,类似这里的计算高度。最后,可能需要比较不同语言实现的差异,比如Python和Java的语法区别,但用户的问题没有指定语言,可能需要给出通用结构或者多种语言的示例。不过用户之前的引用中有Java和C的代码,可能更倾向于这些语言,但Python也是常见的,所以应该涵盖。总结步骤:定义递归函数,终止条件,递归计算左右子树高度,返回最大值加1。给出代码示例,并解释关键点。可能还需要析时间复杂度和空间复杂度,比如O(n)的时间,O(h)的空间(h为树高,递归栈的深度)。</think>### 如何用编程语言实现二叉树高度? #### 算法原理 二叉树高度定义为从根节点到最远叶子节点的**最长路径上的节点数**(或边数,不同定义可能±1)。递归实现的核心思想是: $$树高 = \max(左子树高度, 右子树高度) + 1$$ 当节点为空时,返回高度为0,这是递归的终止条件[^3]。 --- #### 代码实现(Python示例) ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def tree_height(root): if not root: return 0 # 空节点高度为0 left_height = tree_height(root.left) right_height = tree_height(root.right) return max(left_height, right_height) + 1 # 当前层高度=子树最大高度+1 ``` --- #### 关键点解析 1. **递归终止条件**:空节点返回0,确保叶子节点正确计算为高度1 2. **治思想**:将问题拆解为左/右子树高度的子问题(类似快速排序的区思想[^1]) 3. **时间复杂度**:$O(n)$,每个节点访问一次 4. **空间复杂度**:$O(h)$,递归栈深度与树高$h$相关 --- #### 非递归实现(层序遍历) ```python from collections import deque def tree_height_bfs(root): if not root: return 0 queue = deque([root]) height = 0 while queue: level_size = len(queue) for _ in range(level_size): node = queue.popleft() if node.left: queue.append(node.left) if node.right: queue.append(node.right) height += 1 return height ``` --- #### 应用场景 1. 判断二叉树是否平衡(AVL树) 2. 计算树形结构的空间复杂度 3. 图形化渲染树结构时需要高度信息布局 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值