一、思路
什么是树高?
树的高度(或深度)就是树中结点的最大层数。
在这里使用后序遍历的递归算法。
对每一个结点都进行如下操作:
- 后序遍历其左子树求树高
- 后序遍历其右子树求树高
- 对这个结点进行下面操作:
- 比较其左右子树的高度大小
- 若左>右,则选择左的高度;反之,选择右的高度
- 将上一步选出的
高度+1
,并作为返回值返回
递归算法比较抽象,这里举个例子
比如上面这个图,按照后序遍历的序列,第1个遍历到的会是①这个结点。
然后,对①进行上面的处理。
- ①左子树高度为0,右子树高度为0
- 比较左右子树大小,若左大于右,则选择左。此时,左不大于右,那么选右:0
- 对0+1,然后将1返回给上一层。即就是,作为结点④其左子树的高度返回上去。
第2个遍历到的是②这个结点:
同样的道理,可以得到②结点会返回给上一层1。
第3个遍历的是④结点:
遍历到④的时候,其左右子树的高度已经由前两步骤得出来了,都是1。
接着,对4进行同样的操作,比较其左右子树的高度。
若左子树高于右子树,就选择左子树的高度,否则选择右子树。
这里左右都是1。那么选右子树的1。
接着,1+1=2。
这个结果就是遍历根节点⑤的左子树所得到的结果。
然后用同样的方式遍历右子树,最后回到根节点。
对根节点的处理方式也相同:
比较左右树的高度,选高的,然后+1返回最终的结果就是树高。
二、代码实现
这个是代码实现,如果看不明白的,上去看看对每个结点处理的方式,和上面举的例子
typedef struct TreeNode{
int data;
TreeNode *RChild;
TreeNode *LChild;
}TreeNode, *BiTree;
int getdepth(TreeNode* node) {
if (node == NULL) return 0;
int leftdepth = getdepth(node->LChild);
int rightdepth = getdepth(node->RChild);
int depth = 1 + (leftdepth > rightdepth?leftdepth:rightdepth);
return depth;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)