树的算法思想之递归

妖精的绣舞 提交于 2020-01-16 09:10:27

递归

解题关键:
  1. 找出递归关系
  2. 找出终止条件
  3. 确定返回值
例子
  1. 给定一个二叉树,判断它是否是高度平衡的二叉树

算法实现:

int deep(struct TreeNode *p)
{
   //确定出口
    if(p==NULL)
    {
        return 0;
    }
    //递归关系
    int left=1+deep(p->left);
    int right=1+deep(p->right);
    //确定返回值
    return left>right? left:right;
}
bool isBalanced(struct TreeNode* root)
{
    //确定出口
     if(root==NULL)return true;
    int ch=abs(deep(root->left)-deep(root->right));
     //递归关系+递归返回值(根据题目具体情况分析)
    return ch<2 && isBalanced(root->left) && isBalanced(root->right);
}
  1. 给定一个二叉树,找出其最小深度。
    最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
    说明: 叶子节点是指没有子节点的节点。

算法实现1:

int minDepth(struct TreeNode* root)
{
    int left,right;
       //终止条件
    if(root==NULL)return 0;
    if(root->left==NULL && root->right==NULL)return 1;
     
     if(root->left)
     {
         left=minDepth(root->left);
     }
     if(root->right)
     {
         right=minDepth(root->right);
     }
     return left>right ? right+1 : left+1;     
}

算法实现2(代码来源):

int minDepth(struct TreeNode* root){
  //终止条件
	if(root == NULL){
		return 0;
	}
//递归函数(递归关系)即正常情况下应该的行为
	int left_length = minDepth(root->left) + 1;
	int right_length = minDepth(root->right) + 1;
//返回值确定(重点)特殊情况的返回
	if( root->left == NULL ){
		return right_length;
	}else if( root->right == NULL ){
		return left_length;
	}else if( left_length >= right_length ){
		return right_length;
	}else{
		return left_length;
	}
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!