给定一个由N个节点组成的二叉树,任务是用其最接近的偶数完美平方替换一棵二叉树中偶数级出现的所有节点,并用其最接近的奇数完美平方替换奇数级的节点。
例子:
Input: 5
/ \
3 2
/ \
16 19
Output: 9
/ \
4 4
/ \
9 25
Explanation:
Level 1: Nearest odd perfect square to 5 is 9.
Level 2: Nearest even perfect square to 3 and 2 are 4.
Level 3: Nearest odd perfect square to 16 is 9 and to 19 is 25.
Input: 45
/ \
65 32
/
89
Output: 49
/ \
64 36
/
81
Explanation:
Level 1: Nearest odd perfect square to 45 is 49.
Level 2: Nearest even perfect square to 65 and 32 are 64 and 36 respectively.
Level 3: Nearest odd perfect square to 89 is 81.
方法:可以使用级别顺序遍历解决给定的问题。请按照以下步骤解决问题:
- 初始化队列,说q。
- 将root推入队列。
- 队列不为空时循环
- 将当前节点存储在变量中,例如temp_node 。
- 如果当前节点值是一个完美的正方形,请检查以下内容:
- 如果level的值是奇数,并且当前节点的值是偶数,请找到最接近的奇数完美平方并更新temp_node→data 。
- 如果level的值是偶数,并且当前节点的值是奇数,请找到最接近的偶数完美平方并更新temp_node→data 。
- 否则,如果level的值是奇数,则找到最接近的奇数完美平方;如果level的值是偶数,则找到最接近的偶数完美平方。更新temp_node→data 。
- 打印temp_node→data 。
- 将temp_node的子节点(先左后为右子节点)加入q (如果存在)。
- 从q出队当前节点。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Structure of a
// Binary Tree Node
struct Node {
int data;
struct Node *left, *right;
};
// Function to replace all nodes
// at even and odd levels with their
// nearest even or odd perfect squares
void LevelOrderTraversal(Node* root)
{
// Base Case
if (root == NULL)
return;
// Create an empty queue
// for level order traversal
queue q;
// Enqueue root
q.push(root);
// Initialize height
int lvl = 1;
// Iterate until queue is not empty
while (q.empty() == false) {
// Store the size
// of the queue
int n = q.size();
// Traverse in range [1, n]
for (int i = 0; i < n; i++) {
// Store the current node
Node* node = q.front();
// Store its square root
double num = sqrt(node->data);
int x1 = floor(num);
int x2 = ceil(num);
// Check if it is a perfect square
if (x1 == x2) {
// If level is odd and value is even,
// find the closest odd perfect square
if ((lvl & 1) && !(x1 & 1)) {
int num1 = x1 - 1, num2 = x1 + 1;
node->data
= (abs(node->data - num1 * num1)
< abs(node->data - num2 * num2))
? (num1 * num1)
: (num2 * num2);
}
// If level is even and value is odd,
// find the closest even perfect square
if (!(lvl & 1) && (x1 & 1)) {
int num1 = x1 - 1, num2 = x1 + 1;
node->data
= (abs(node->data - num1 * num1)
< abs(node->data - num2 * num2))
? (num1 * num1)
: (num2 * num2);
}
}
// Otherwise, find the find
// the nearest perfect sqaure
else {
if (lvl & 1)
node->data
= (x1 & 1) ? (x1 * x1) : (x2 * x2);
else
node->data
= (x1 & 1) ? (x2 * x2) : (x1 * x1);
}
// Print front of queue
// and remove it from queue
cout << node->data << " ";
q.pop();
// Enqueue left child
if (node->left != NULL)
q.push(node->left);
// Enqueue right child
if (node->right != NULL)
q.push(node->right);
}
// Increment the level by 1
lvl++;
cout << endl;
}
}
// Utility function to
// create a new tree node
Node* newNode(int data)
{
Node* temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
// Driver Code
int main()
{
// Binary Tree
Node* root = newNode(5);
root->left = newNode(3);
root->right = newNode(2);
root->right->left = newNode(16);
root->right->right = newNode(19);
LevelOrderTraversal(root);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
import java.util.*;
// Structure of a
// Binary Tree Node
class Node
{
int data;
Node left, right;
Node(int data)
{
this.data = data;
left = right = null;
}
}
class GFG{
// Function to replace all nodes
// at even and odd levels with their
// nearest even or odd perfect squares
static void LevelOrderTraversal(Node root)
{
// Base Case
if (root == null)
return;
// Create an empty queue
// for level order traversal
Queue q = new LinkedList<>();
// Enqueue root
q.add(root);
// Initialize height
int lvl = 1;
// Iterate until queue is not empty
while (q.size() != 0)
{
// Store the size
// of the queue
int n = q.size();
// Traverse in range [1, n]
for(int i = 0; i < n; i++)
{
// Store the current node
Node node = q.peek();
// Store its square root
double num = Math.sqrt(node.data);
int x1 = (int)Math.floor(num);
int x2 = (int)Math.ceil(num);
// Check if it is a perfect square
if (x1 == x2)
{
// If level is odd and value is even,
// find the closest odd perfect square
if (((lvl & 1) != 0) && !((x1 & 1) != 0))
{
int num1 = x1 - 1, num2 = x1 + 1;
node.data = (Math.abs(node.data - num1 * num1) <
Math.abs(node.data - num2 * num2)) ?
(num1 * num1) : (num2 * num2);
}
// If level is even and value is odd,
// find the closest even perfect square
if (!((lvl & 1) != 0) && ((x1 & 1) != 0))
{
int num1 = x1 - 1, num2 = x1 + 1;
node.data = (Math.abs(node.data - num1 * num1) <
Math.abs(node.data - num2 * num2)) ?
(num1 * num1) : (num2 * num2);
}
}
// Otherwise, find the find
// the nearest perfect sqaure
else
{
if ((lvl & 1) != 0)
node.data = (x1 & 1) != 0 ?
(x1 * x1) : (x2 * x2);
else
node.data = (x1 & 1) != 0 ?
(x2 * x2) : (x1 * x1);
}
// Print front of queue
// and remove it from queue
System.out.print(node.data + " ");
q.poll();
// Enqueue left child
if (node.left != null)
q.add(node.left);
// Enqueue right child
if (node.right != null)
q.add(node.right);
}
// Increment the level by 1
lvl++;
System.out.println();
}
}
// Driver Code
public static void main (String[] args)
{
// Binary Tree
Node root = new Node(5);
root.left = new Node(3);
root.right = new Node(2);
root.right.left = new Node(16);
root.right.right = new Node(19);
LevelOrderTraversal(root);
}
}
// This code is contributed by avanitrachhadiya2155
Python3
# Python3 program for the above approach
from collections import deque
from math import sqrt, ceil, floor
# Structure of a
# Binary Tree Node
class Node:
def __init__(self, x):
self.data = x
self.left = None
self.right = None
# Function to replace all nodes
# at even and odd levels with their
# nearest even or odd perfect squares
def LevelOrderTraversal(root):
# Base Case
if (root == None):
return
# Create an empty queue
# for level order traversal
q = deque()
# Enqueue root
q.append(root)
# Initialize height
lvl = 1
# Iterate until queue is not empty
while (len(q) > 0):
# Store the size
# of the queue
n = len(q)
# Traverse in range [1, n]
for i in range(n):
# Store the current node
node = q.popleft()
# Store its square root
num = sqrt(node.data)
x1 = floor(num)
x2 = ceil(num)
# Check if it is a perfect square
if (x1 == x2):
# If level is odd and value is even,
# find the closest odd perfect square
if ((lvl & 1) and not (x1 & 1)):
num1, num2 = x1 - 1, x1 + 1
node.data = (num1 * num1) if (abs(node.data - num1 * num1) < abs(node.data - num2 * num2)) else (num2 * num2)
# If level is even and value is odd,
# find the closest even perfect square
if (not (lvl & 1) and (x1 & 1)):
num1,num2 = x1 - 1, x1 + 1
node.data = (num1 * num1) if (abs(node.data - num1 * num1) < abs(node.data - num2 * num2)) else (num2 * num2)
# Otherwise, find the find
# the nearest perfect sqaure
else:
if (lvl & 1):
node.data = (x1 * x1) if (x1 & 1) else (x2 * x2)
else:
node.data = (x2 * x2) if (x1 & 1) else (x1 * x1)
# Prfront of queue
# and remove it from queue
print(node.data, end = " ")
# Enqueue left child
if (node.left != None):
q.append(node.left)
# Enqueue right child
if (node.right != None):
q.append(node.right)
# Increment the level by 1
lvl += 1
print()
# Driver Code
if __name__ == '__main__':
# Binary Tree
root = Node(5)
root.left = Node(3)
root.right = Node(2)
root.right.left = Node(16)
root.right.right = Node(19)
LevelOrderTraversal(root)
# This code is contributed by mohit kumar 29.
C#
// C# program for the above approach
using System;
using System.Collections.Generic;
// Structure of a
// Binary Tree Node
public class Node
{
public int data;
public Node left, right;
public Node(int data)
{
this.data = data;
left = right = null;
}
}
public class GFG
{
// Function to replace all nodes
// at even and odd levels with their
// nearest even or odd perfect squares
static void LevelOrderTraversal(Node root)
{
// Base Case
if (root == null)
return;
// Create an empty queue
// for level order traversal
Queue q = new Queue();
// Enqueue root
q.Enqueue(root);
// Initialize height
int lvl = 1;
// Iterate until queue is not empty
while (q.Count != 0)
{
// Store the size
// of the queue
int n = q.Count;
// Traverse in range [1, n]
for(int i = 0; i < n; i++)
{
// Store the current node
Node node = q.Peek();
// Store its square root
double num = Math.Sqrt(node.data);
int x1 = (int)Math.Floor(num);
int x2 = (int)Math.Ceiling(num);
// Check if it is a perfect square
if (x1 == x2)
{
// If level is odd and value is even,
// find the closest odd perfect square
if (((lvl & 1) != 0) && !((x1 & 1) != 0))
{
int num1 = x1 - 1, num2 = x1 + 1;
node.data = (Math.Abs(node.data - num1 * num1) <
Math.Abs(node.data - num2 * num2)) ?
(num1 * num1) : (num2 * num2);
}
// If level is even and value is odd,
// find the closest even perfect square
if (!((lvl & 1) != 0) && ((x1 & 1) != 0))
{
int num1 = x1 - 1, num2 = x1 + 1;
node.data = (Math.Abs(node.data - num1 * num1) <
Math.Abs(node.data - num2 * num2)) ?
(num1 * num1) : (num2 * num2);
}
}
// Otherwise, find the find
// the nearest perfect sqaure
else
{
if ((lvl & 1) != 0)
node.data = (x1 & 1) != 0 ?
(x1 * x1) : (x2 * x2);
else
node.data = (x1 & 1) != 0 ?
(x2 * x2) : (x1 * x1);
}
// Print front of queue
// and remove it from queue
Console.Write(node.data + " ");
q.Dequeue();
// Enqueue left child
if (node.left != null)
q.Enqueue(node.left);
// Enqueue right child
if (node.right != null)
q.Enqueue(node.right);
}
// Increment the level by 1
lvl++;
Console.WriteLine();
}
}
// Driver Code
static public void Main ()
{
// Binary Tree
Node root = new Node(5);
root.left = new Node(3);
root.right = new Node(2);
root.right.left = new Node(16);
root.right.right = new Node(19);
LevelOrderTraversal(root);
}
}
// This code is contributed by rag2127
9
4 4
9 25
时间复杂度: O(N)
辅助空间: O(N)