二叉树4:二叉树求树高度(超级详细)

一、思路

什么是树高? 树的高度(或深度)就是树中结点的最大层数。

在这里使用后序遍历的递归算法。

对每一个结点都进行如下操作:

    后序遍历其左子树求树高 后序遍历其右子树求树高 对这个结点进行下面操作: 比较其左右子树的高度大小 若左>右,则选择左的高度;反之,选择右的高度 将上一步选出的高度+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 PostTreeHeight(BiTree *T){
          
   
	//通过后序遍历实现求树的高度
	int h = 0, hl = 0, hr = 0;
	if (T==NULL){
          
   
		return True;
	}else{
          
   
		hl = PostTreeHeight(T->LChild);//递归遍历左子树
		hr = PostTreeHeight(T->RChild);//递归遍历右子树
		h = (hr > hl)?hr:hl + 1;//三目运算符,很简单
		//如果hr大于hl,那么就取hr的值,然后hr+1赋值给h
		//如果hr不大于h1,那么就取hl得值,然后hl+1赋值给h
		return h;
	}
}
经验分享 程序员 微信小程序 职场和发展