给定两个整数N和K ,其中N表示二叉树的高度,任务是在后序遍历为第一的二叉树中找到值为K的节点的父级
自然数
For N = 3, the Tree will be -
7
/ \
3 6
/ \ / \
1 2 4 5
例子:
Input: N = 4, K = 5
Output: 6
Explanation:
Parent of the node 5 is 6. As shown in the tree above.
Input: N = 5, K = 3
Output: 7
Explanation:
Parent of the node 3 is 7. As shown in the tree above.
天真的方法:一种简单的方法是根据以下模式构建树,然后遍历整个树以找到给定节点的父级。
高效方法:想法是使用二进制搜索来找到节点的父级。众所周知,高度为N的二叉树具有
节点。因此,二进制搜索的搜索空间将为1到
现在每个节点都有子级值
或者
因此,可以轻松找到此类节点的父级。
下面是上述方法的实现:
C++
// C++ implementation to find the
// parent of the given node K in
// a binary tree whose post-order
// traversal is N natural numbers
#include
using namespace std;
// Function to find the parent
// of the given node
int findParent(int height, int node)
{
int start = 1;
int end = pow(2, height) - 1;
// Condition to check whether
// the given node is a root node.
// if it is then return -1 because
// root node has no parent
if (end == node)
return -1;
// Loop till we found
// the given node
while (node >= 1) {
end = end - 1;
// Finding the middle node of the
// tree because at every level
// tree parent is
// divided into two halves
int mid = start
+ (end - start)
/ 2;
// if the node is found return
// the parent always the child
// nodes of every node
// is node/2 or (node-1)
if (mid == node || end == node) {
return (end + 1);
}
// if the node to be found
// is greater than the mid
// search for left subtree else
// search in right subtree
else if (node < mid) {
end = mid;
}
else {
start = mid;
}
}
}
// Driver Code
int main()
{
int height = 4;
int node = 6;
int k = findParent(height, node);
cout << k;
return 0;
}
Java
// Java implementation to find the
// parent of the given node K in
// a binary tree whose post-order
// traversal is N natural numbers
import java.util.*;
class GFG{
// Function to find the parent
// of the given node
static int findParent(int height,
int node)
{
int start = 1;
int end = (int)Math.pow(2, height) - 1;
// Condition to check whether
// the given node is a root node.
// if it is then return -1 because
// root node has no parent
if (end == node)
return -1;
// Loop till we found
// the given node
while (node >= 1)
{
end = end - 1;
// Finding the middle node of the
// tree because at every level
// tree parent is
// divided into two halves
int mid = start + (end - start) / 2;
// if the node is found return
// the parent always the child
// nodes of every node
// is node*/2 or (node-1)
if (mid == node || end == node)
{
return (end + 1);
}
// if the node to be found
// is greater than the mid
// search for left subtree else
// search in right subtree
else if (node < mid)
{
end = mid;
}
else
{
start = mid;
}
}
return -1;
}
// Driver Code
public static void main(String[] args)
{
int height = 4;
int node = 6;
int k = findParent(height, node);
System.out.print(k);
}
}
// This code is contributed by gauravrajput1
Python3
# Python implementation to find the
# parent of the given node
import math
# Function to find the parent
# of the given node
def findParent(height, node):
start = 1
end = pow(2, height) - 1
# Check whether the given node
# is a root node.if it is then
# return -1 because root
# node has no parent
if (end == node):
return -1
# Loop till we found
# the given node
while(node >= 1):
end = end - 1
# Find the middle node of the
# tree because at every level
# tree parent is divided
# into two halves
mid = start + (end - start)//2
# if the node is found
# return the parent
# always the child nodes of every
# node is node / 2 or (node-1)
if(mid == node or end == node):
return (end + 1)
# if the node to be found is greater
# than the mid search for left
# subtree else search in right subtree
elif (node < mid):
end = mid
else:
start = mid
# Driver code
if __name__ == "__main__":
height = 4
node = 6
# Function Call
k = findParent(height, node)
print(k)
C#
// C# implementation to find the
// parent of the given node K in
// a binary tree whose post-order
// traversal is N natural numbers
using System;
class GFG{
// Function to find the parent
// of the given node
static int findParent(int height,
int node)
{
int start = 1;
int end = (int)Math.Pow(2, height) - 1;
// Condition to check whether
// the given node is a root node.
// if it is then return -1 because
// root node has no parent
if (end == node)
return -1;
// Loop till we found
// the given node
while (node >= 1)
{
end = end - 1;
// Finding the middle node of the
// tree because at every level
// tree parent is
// divided into two halves
int mid = start + (end - start) / 2;
// if the node is found return
// the parent always the child
// nodes of every node
// is node*/2 or (node-1)
if (mid == node || end == node)
{
return (end + 1);
}
// if the node to be found
// is greater than the mid
// search for left subtree else
// search in right subtree
else if (node < mid)
{
end = mid;
}
else
{
start = mid;
}
}
return -1;
}
// Driver Code
public static void Main(String[] args)
{
int height = 4;
int node = 6;
int k = findParent(height, node);
Console.Write(k);
}
}
// This code is contributed by Princi Singh
输出:
7