个性化阅读
专注于IT技术分析

算法设计:求二叉树的垂直宽度|S1

本文概述

给定一棵二叉树, 找到二叉树的垂直宽度。二叉树的宽度是垂直路径的数量。

算法设计:求二叉树的垂直宽度

在此图像中, 树包含6条垂直线, 这是树的所需宽度。

例子 :

Input : 
             7
           /  \
          6    5
         / \  / \
        4   3 2  1 
Output :
5

Input :
           1
         /    \
        2       3
       / \     / \
      4   5   6   7
               \   \ 
                8   9 
Output :
6

方法:

如果我们向左走, 则进行有序遍历, 然后获取一个临时变量, 则温度值减小;如果向右走, 则温度值增大。声明一个条件, 如果最小值大于temp, 则最小值= temp, 如果最大值小于temp, 则最大值= temp。最后, 打印最小+最大, 即树的垂直宽度。

C ++

// CPP program to print vertical width
// of a tree
#include <bits/stdc++.h>
using namespace std;
  
// A Binary Tree Node
struct Node
{
     int data;
     struct Node *left, *right;
};
  
// get vertical width
void lengthUtil(Node* root, int &maximum, int &minimum, int curr=0)
{
     if (root == NULL)
         return ;
  
     // traverse left
     lengthUtil(root->left, maximum, minimum, curr - 1);
  
     // if curr is decrease then get
     // value in minimum
     if (minimum > curr)
         minimum = curr;
  
     // if curr is increase then get
     // value in maximum
     if (maximum < curr)
         maximum = curr;
  
  
     // traverse right
     lengthUtil(root->right, maximum, minimum, curr + 1);
  
}
  
int getLength(Node* root)
{
     int maximum = 0, minimum = 0;
     lengthUtil(root, maximum, minimum, 0);
  
     // 1 is added to include root in the width
     return ( abs (minimum) + maximum) + 1;
}
  
// Utility function to create a new tree node
Node* newNode( int data)
{
     Node* curr = new Node;
     curr->data = data;
     curr->left = curr->right = NULL;
     return curr;
}
  
// Driver program to test above functions
int main()
{
  
     Node* root = newNode(7);
     root->left = newNode(6);
     root->right = newNode(5);
     root->left->left = newNode(4);
     root->left->right = newNode(3);
     root->right->left = newNode(2);
     root->right->right = newNode(1);
  
     cout << getLength(root) << "\n" ;
  
     return 0;
}

Java

// Java program to print vertical width
// of a tree
import java.util.*;
  
class GFG
{
  
// A Binary Tree Node
static class Node
{
     int data;
     Node left, right;
};
static int maximum = 0 , minimum = 0 ;
  
// get vertical width
static void lengthUtil(Node root, int curr)
{
     if (root == null )
         return ;
  
     // traverse left
     lengthUtil(root.left, curr - 1 );
  
     // if curr is decrease then get
     // value in minimum
     if (minimum > curr)
         minimum = curr;
  
     // if curr is increase then get
     // value in maximum
     if (maximum < curr)
         maximum = curr;
  
     // traverse right
     lengthUtil(root.right, curr + 1 );
}
  
static int getLength(Node root)
{
     maximum = 0 ; minimum = 0 ;
     lengthUtil(root, 0 );
  
     // 1 is added to include root in the width
     return (Math.abs(minimum) + maximum) + 1 ;
}
  
// Utility function to create a new tree node
static Node newNode( int data)
{
     Node curr = new Node();
     curr.data = data;
     curr.left = curr.right = null ;
     return curr;
}
  
// Driver Code
public static void main(String[] args) 
{
     Node root = newNode( 7 );
     root.left = newNode( 6 );
     root.right = newNode( 5 );
     root.left.left = newNode( 4 );
     root.left.right = newNode( 3 );
     root.right.left = newNode( 2 );
     root.right.right = newNode( 1 );
  
     System.out.println(getLength(root));
}
}
  
// This code is contributed by Rajput-Ji

Python3

# Python3 program to prvertical width 
# of a tree 
  
# class to create a new tree node 
class newNode:
     def __init__( self , data): 
         self .data = data 
         self .left = self .right = None
  
# get vertical width 
def lengthUtil(root, maximum, minimum, curr = 0 ):
     if (root = = None ):
         return
  
     # traverse left 
     lengthUtil(root.left, maximum, minimum, curr - 1 ) 
  
     # if curr is decrease then get 
     # value in minimum 
     if (minimum[ 0 ] > curr):
         minimum[ 0 ] = curr 
  
     # if curr is increase then get 
     # value in maximum 
     if (maximum[ 0 ] < curr):
         maximum[ 0 ] = curr 
  
     # traverse right 
     lengthUtil(root.right, maximum, minimum, curr + 1 )
  
def getLength(root):
     maximum = [ 0 ]
     minimum = [ 0 ] 
     lengthUtil(root, maximum, minimum, 0 ) 
  
     # 1 is added to include root in the width 
     return ( abs (minimum[ 0 ]) + maximum[ 0 ]) + 1
  
# Driver Code
if __name__ = = '__main__' :
  
     root = newNode( 7 ) 
     root.left = newNode( 6 ) 
     root.right = newNode( 5 ) 
     root.left.left = newNode( 4 ) 
     root.left.right = newNode( 3 ) 
     root.right.left = newNode( 2 ) 
     root.right.right = newNode( 1 ) 
  
     print (getLength(root))
  
# This code is contributed by PranchalK

C#

// C# program to print vertical width
// of a tree
using System;
      
class GFG
{
  
// A Binary Tree Node
public class Node
{
     public int data;
     public Node left, right;
};
static int maximum = 0, minimum = 0;
  
// get vertical width
static void lengthUtil(Node root, int curr)
{
     if (root == null )
         return ;
  
     // traverse left
     lengthUtil(root.left, curr - 1);
  
     // if curr is decrease then get
     // value in minimum
     if (minimum > curr)
         minimum = curr;
  
     // if curr is increase then get
     // value in maximum
     if (maximum < curr)
         maximum = curr;
  
     // traverse right
     lengthUtil(root.right, curr + 1);
}
  
static int getLength(Node root)
{
     maximum = 0; minimum = 0;
     lengthUtil(root, 0);
  
     // 1 is added to include root in the width
     return (Math.Abs(minimum) + maximum) + 1;
}
  
// Utility function to create a new tree node
static Node newNode( int data)
{
     Node curr = new Node();
     curr.data = data;
     curr.left = curr.right = null ;
     return curr;
}
  
// Driver Code
public static void Main(String[] args) 
{
     Node root = newNode(7);
     root.left = newNode(6);
     root.right = newNode(5);
     root.left.left = newNode(4);
     root.left.right = newNode(3);
     root.right.left = newNode(2);
     root.right.right = newNode(1);
  
     Console.WriteLine(getLength(root));
}
}
  
// This code is contributed by PrinciRaj1992

输出如下:

5

时间复杂度:O(n)

辅助空间:O(h)其中h是二叉树的高度。递归调用需要大量空间。


赞(0) 打赏
未经允许不得转载:srcmini » 算法设计:求二叉树的垂直宽度|S1
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏