二叉树的路径与深度的一些问题

转载自:https://blog.csdn.net/alpha_love/article/details/73042637



二叉树的深度###

(1)二叉树的最大深度(即根节点到最深叶子节点之间的节点数)


  
  
  1. int maxDepth ( TreeNode * root ){
  2. if ( root == NULL )
  3. return 0 ;
  4. int nLeft = maxDepth ( root -> left );
  5. int nRight = maxDepth ( root -> right );
  6. return max ( nLeft , nRight ) + 1 ;
  7. }

(2)二叉树的最小深度(即根节点到最浅叶子节点之间的节点数) (时间复杂度为o(n),空间复杂度为o(logn)):


  
  
  1. class Solution {
  2. public :
  3. int minDepth ( TreeNode * root ){
  4. return minDepth ( root , false );
  5. }
  6. private :
  7. static int minDepth ( const TreeNode * root , bool hasbrother ){
  8. if ( root == NULL )
  9. return hasbrother ? INT_MAX : 0 ;
  10. return min ( minDepth ( root -> left , root -> right != NULL ),
  11. minDepth ( root -> right , root -> left != NULL )) + 1 ;
  12. }
  13. };

###二叉树的路径和问题###

(1)给定一个二叉树和一个值,检测是否存在从根节点到叶子节点的路径,使得路径上的节点值的总和等于给定的值。


  
  
  1. //时间复杂度为o(n),空间复杂度为o(logn)
  2. int hasPathSum ( TreeNode * root , int sum ){
  3. if ( root == NULL )
  4. return false ;
  5. if ( root -> left == NULL && root -> right == NULL )
  6. return sum == root -> data ;
  7. return hasPathSum ( root -> left , sum - root -> data )
  8. || hasPathSum ( root -> right , sum - root -> data );
  9. }

(2)给定一个二叉树和一个值,找出所有从根节点到叶子节点路径中的节点总值的路径。


  
  
  1. class Solution {
  2. public :
  3. vector < vector < int > > v ; > v ; > v ; pathSum ( TreeNode * root , int sum ){
  4. vector < vector < int > > result ;
  5. vector < int > cur ; //中间结果
  6. pathSum ( root , sum , cur , result );
  7. return result ;
  8. }
  9. private :
  10. void pathSum ( TreeNode * root , int gap , vector < int >
  11. & cur , vector < vector < int > > & result ){
  12. if ( root == NULL )
  13. return ;
  14. cur . push_back ( root -> data );
  15. if ( root -> left == NULL && root -> right == NULL ){
  16. if ( root -> data == gap ){
  17. result . push_back ( cur );
  18. }
  19. } //叶子节点
  20. pathSum ( root -> left , gap - root -> data , cur , result );
  21. pathSum ( root -> right , gap - root -> data , cur , result );
  22. cur . pop_back ();
  23. }
  24. };

(3)给定一个二叉树,计算最长的路径和,使得任意两节点的路径上所有节点之和最大(和最长序列和问题类似,只是变成两个方向)。


  
  
  1. class Solution {
  2. public :
  3. int maxDepthSum ( TreeNode * root ){
  4. max_sum = INT_MIN ;
  5. dfs ( root );
  6. return max_sum ;
  7. }
  8. private :
  9. int max_sum ;
  10. int dfs ( const TreeNode * root ){
  11. if ( root == NULL )
  12. return 0 ;
  13. int l = dfs ( root -> left );
  14. int r = dfs ( root -> right );
  15. int sum = root -> data ;
  16. if ( l > 0 )
  17. sum += l ;
  18. if ( r > 0 )
  19. sum += r ;
  20. max_sum = max ( max_sum , sum );
  21. return max ( r , l ) > 0 ? max ( r , l ) + root -> data : root -> data ;
  22. }
  23. };
        </div>
            </div>


猜你喜欢

转载自blog.csdn.net/zishengzheng/article/details/81710096
今日推荐