📜  使用递归的二叉树的底视图

📅  最后修改于: 2022-05-13 01:57:19.432000             🧑  作者: Mango

使用递归的二叉树的底视图

给定一棵二叉树,任务是使用递归找到二叉树的底部视图。

例子:

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

Input:
        20
      /    \
    8       22
  /   \    /   \
5      10 21     25
      / \      
    9    14
 
Output: 5 9 21 14 25

方法:
我们可以通过使用递归和 2 个数组来做到这一点,每个数组的大小为 2n+1(最坏的情况),其中 n = 给定树中的元素数。在这里,我们采用一个变量 x 来确定它的水平距离。设 x 是节点的水平距离。现在,左孩子的水平距离为 x-1(x 减 1),右孩子的水平距离为 x+1(x 加 1)。将另一个变量“p”作为优先级,它将决定该元素属于哪个级别。

1 (x=0, p=0)
      \
        2 (x=1, p=1)
          \
            4 (x=2, p=2)
          /  \
(x=1, p=3) 3     5 (x=3, p=3)

在遍历树时以 Right-> Node-> Left 的方式,将 x 和 p 分配给每个 Node,如果数组在位置 (mid+x) 处为空,则同时将 node 的数据插入第一个数组中。如果数组不为空并且有更高优先级(p)的节点来更新数组,这个节点的数据作为位置(mid+x)。第二个数组将维护第一个数组检查代码中每个插入节点的优先级(p),以便更好地理解。

以下是上述方法的实现:

C++
#include 
using namespace std;
 
struct Node {
    int data;
    // left and right references
    Node *left, *right;
    // Constructor of tree Node
    Node(int key)
    {
        data = key;
        left = right = NULL;
    }
};
 
int l = 0, r = 0;
int N;
 
// Function to generate
// bottom view of
// binary tree
void Bottom(Node* root, int arr[], int arr2[], int x, int p, int mid)
{
    // Base case
    if (root == NULL) {
        return;
    }
 
    if (x < l) {
        // To store leftmost
        // value of x in l
        l = x;
    }
 
    // To store rightmost
    // value of x in r
    if (x > r) {
        r = x;
    }
 
    // To check if arr
    // is empty at mid+x
    if (arr[mid + x] == INT_MIN) {
        // Insert data of Node
        // at arr[mid+x]
        arr[mid + x] = root->data;
        // Insert priority of
        // that Node at arr2[mid+x]
        arr2[mid + x] = p;
    }
 
    // If not empty and priotiy
    // of previously inserted
    // Node is less than current*/
    else if (arr2[mid + x] < p) {
        // Insert current
        // Node data at arr[mid+x]
        arr[mid + x] = root->data;
 
        // Insert priotiy of
        // that Node at arr2[mid +x]
        arr2[mid + x] = p;
    }
 
    // Go right first
    // then left
    Bottom(root->right, arr, arr2, x + 1, p + 1, mid);
    Bottom(root->left, arr, arr2, x - 1, p + 1, mid);
}
 
// Utility function
// to generate bottom
// view of a biany tree
void bottomView(struct Node* root)
{
    int arr[2 * N + 1];
    int arr2[2 * N + 1];
 
    for (int i = 0; i < 2 * N + 1; i++) {
        arr[i] = INT_MIN;
        arr2[i] = INT_MIN;
    }
 
    int mid = N, x = 0, p = 0;
 
    Bottom(root, arr, arr2, x, p, mid);
 
    for (int i = mid + l; i <= mid + r; i++) {
        cout << arr[i] << " ";
    }
}
 
// Driver code
int main()
{
 
    N = 5;
    Node* root = new Node(1);
    root->right = new Node(2);
    root->right->right = new Node(4);
    root->right->right->left = new Node(3);
    root->right->right->right = new Node(5);
 
    bottomView(root);
 
    return 0;
}


Java
class GFG{
     
static class Node
{
    int data;
     
    // left and right references
    Node left, right;
     
    // Constructor of tree Node
    public Node(int key)
    {
        data = key;
        left = right = null;
    }
};
 
static int l = 0, r = 0, N;
 
// Function to generate
// bottom view of binary tree
static void Bottom(Node root, int arr[],
                  int arr2[], int x,
                       int p, int mid)
{
     
    // Base case
    if (root == null)
    {
        return;
    }
 
    if (x < l)
    {
         
        // To store leftmost
        // value of x in l
        l = x;
    }
 
    // To store rightmost
    // value of x in r
    if (x > r)
    {
        r = x;
    }
 
    // To check if arr
    // is empty at mid+x
    if (arr[mid + x] == Integer.MIN_VALUE)
    {
         
        // Insert data of Node
        // at arr[mid+x]
        arr[mid + x] = root.data;
         
        // Insert priority of
        // that Node at arr2[mid+x]
        arr2[mid + x] = p;
    }
 
    // If not empty and priotiy
    // of previously inserted
    // Node is less than current*/
    else if (arr2[mid + x] < p)
    {
         
        // Insert current
        // Node data at arr[mid+x]
        arr[mid + x] = root.data;
 
        // Insert priotiy of
        // that Node at arr2[mid +x]
        arr2[mid + x] = p;
    }
 
    // Go right first
    // then left
    Bottom(root.right, arr, arr2,
           x + 1, p + 1, mid);
    Bottom(root.left, arr, arr2,
           x - 1, p + 1, mid);
}
 
// Utility function to generate
// bottom view of a biany tree
static void bottomView(Node root)
{
    int[] arr = new int[2 * N + 1];
    int[] arr2 = new int[2 * N + 1];
 
    for(int i = 0; i < 2 * N + 1; i++)
    {
        arr[i] = Integer.MIN_VALUE;
        arr2[i] = Integer.MIN_VALUE;
    }
 
    int mid = N, x = 0, p = 0;
 
    Bottom(root, arr, arr2, x, p, mid);
 
    for(int i = mid + l; i <= mid + r; i++)
    {
        System.out.print(arr[i] + " ");
    }
}
 
// Driver code
public static void main(String[] args)
{
    N = 5;
     
    Node root = new Node(1);
    root.right = new Node(2);
    root.right.right = new Node(4);
    root.right.right.left = new Node(3);
    root.right.right.right = new Node(5);
 
    bottomView(root);
}
}
 
// This code is contributed by sanjeev2552


Python3
class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
l = 0
r = 0
INT_MIN = -(2**32)
 
# Function to generate
# bottom view of
# binary tree
def Bottom(root, arr, arr2, x, p, mid):
    global INT_MIN, l, r
     
    # Base case
    if (root == None):
        return
     
    if (x < l):
         
        # To store leftmost
        # value of x in l
        l = x
     
    # To store rightmost
    # value of x in r
    if (x > r):
        r = x
         
    # To check if arr
    # is empty at mid+x
    if (arr[mid + x] == INT_MIN):
 
        # Insert data of Node
        # at arr[mid+x]
        arr[mid + x] = root.data
 
        # Insert priority of
        # that Node at arr2[mid+x]
        arr2[mid + x] = p
         
    # If not empty and priotiy
    # of previously inserted
    # Node is less than current*/
    elif (arr2[mid + x] < p):
 
        # Insert current
        # Node data at arr[mid+x]
        arr[mid + x] = root.data
         
        # Insert priotiy of
        # that Node at arr2[mid +x]
        arr2[mid + x] = p
     
    # Go right first
    # then left
    Bottom(root.right, arr, arr2, x + 1, p + 1, mid)
    Bottom(root.left, arr, arr2, x - 1, p + 1, mid)
 
# Utility function
# to generate bottom
# view of a biany tree
def bottomView(root):
    global INT_MIN
    arr = [0]*(2 * N + 1)
    arr2 = [0]*(2 * N + 1)
     
    for i in range(2 * N + 1):
        arr[i] = INT_MIN
        arr2[i] = INT_MIN
    mid = N
    x = 0
    p = 0
    Bottom(root, arr, arr2, x, p, mid)
     
    for i in range(mid + l,mid + r + 1):
        print(arr[i], end = " ")
         
# Driver code
N = 5
root = Node(1)
root.right = Node(2)
root.right.right = Node(4)
root.right.right.left = Node(3)
root.right.right.right = Node(5)
 
bottomView(root)
     
# This code is contributed by SHUBHAMSINGH10


C#
using System;
 
class GFG{
     
class Node{
     
public int data;
 
// left and right references
public Node left, right;
 
// Constructor of tree Node
public Node(int key)
{
    data = key;
    left = right = null;
}
};
 
static int l = 0, r = 0, N;
 
// Function to generate
// bottom view of binary tree
static void Bottom(Node root, int []arr,
                  int []arr2, int x,
                       int p, int mid)
{
     
    // Base case
    if (root == null)
    {
        return;
    }
 
    if (x < l)
    {
         
        // To store leftmost
        // value of x in l
        l = x;
    }
 
    // To store rightmost
    // value of x in r
    if (x > r)
    {
        r = x;
    }
 
    // To check if arr
    // is empty at mid+x
    if (arr[mid + x] == Int32.MinValue)
    {
         
        // Insert data of Node
        // at arr[mid+x]
        arr[mid + x] = root.data;
         
        // Insert priority of
        // that Node at arr2[mid+x]
        arr2[mid + x] = p;
    }
 
    // If not empty and priotiy
    // of previously inserted
    // Node is less than current*/
    else if (arr2[mid + x] < p)
    {
         
        // Insert current
        // Node data at arr[mid+x]
        arr[mid + x] = root.data;
 
        // Insert priotiy of
        // that Node at arr2[mid +x]
        arr2[mid + x] = p;
    }
 
    // Go right first
    // then left
    Bottom(root.right, arr, arr2,
           x + 1, p + 1, mid);
    Bottom(root.left, arr, arr2,
           x - 1, p + 1, mid);
}
 
// Utility function to generate
// bottom view of a biany tree
static void bottomView(Node root)
{
    int[] arr = new int[2 * N + 1];
    int[] arr2 = new int[2 * N + 1];
 
    for(int i = 0; i < 2 * N + 1; i++)
    {
        arr[i] = Int32.MinValue;
        arr2[i] = Int32.MinValue;
    }
 
    int mid = N, x = 0, p = 0;
 
    Bottom(root, arr, arr2, x, p, mid);
 
    for(int i = mid + l; i <= mid + r; i++)
    {
        Console.Write(arr[i] + " ");
    }
}
 
// Driver code
public static void Main(string[] args)
{
    N = 5;
     
    Node root = new Node(1);
    root.right = new Node(2);
    root.right.right = new Node(4);
    root.right.right.left = new Node(3);
    root.right.right.right = new Node(5);
 
    bottomView(root);
}
}
 
// This code is contributed by rutvik_56


Javascript


输出:
1 3 4 5