给定一棵二叉树和一个值K ,任务是检查二叉树的每个节点的节点值是否为K或它的相邻连接节点中至少一个节点的值为K。
例子:
Input:
1
/ \
0 0
/ \ \
1 0 1
/ / \ \
2 1 0 5
/ /
3 0
/
0
K = 0
Output: False
Explanation:
We can observe that some leaf nodes
are having value other than 0 and
are not connected with any
adjacent node whose value is 0.
Input:
0
/ \
2 1
\
0
K = 0
Output: True
Explanation:
Since, all nodes of the tree
are either having value 0 or
connected with adjacent node
having value 0.
方法:
- 这个想法是简单地执行预遍历并递归地传递父节点的引用。
- 在遍历每个节点时,请检查以下条件:
- 如果节点的值为K或,
- 如果其父节点值为K或,
- 如果其任何子节点值为K。
- 如果树的任何节点不满足给定的三个条件中的任何一个,则返回False,否则返回True。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
#include
#include
using namespace std;
// Defining tree node
struct node {
int value;
struct node *right, *left;
};
// Utility function to create
// a new node
struct node* newnode(int key)
{
struct node* temp = new node;
temp->value = key;
temp->right = NULL;
temp->left = NULL;
return temp;
}
// Function to check binary
// tree whether its every node
// has value K or, it is
// connected with node having
// value K
bool connectedK(node* root,
node* parent,
int K,
bool flag)
{
// checking node value
if (root->value != K) {
// checking the left
// child value
if (root->left == NULL
|| root->left->value != K) {
// checking the rigth
// child value
if (root->right == NULL
|| root->right->value != K) {
// checking the parent value
if (parent == NULL
|| parent->value != K) {
flag = false;
return flag;
}
}
}
}
// Traversing to the left subtree
if (root->left != NULL) {
if (flag == true) {
flag
= connectedK(root->left,
root, K, flag);
}
}
// Traversing to the right subtree
if (root->right != NULL) {
if (flag == true) {
flag
= connectedK(root->right,
root, K, flag);
}
}
return flag;
}
// Driver code
int main()
{
// Input Binary tree
struct node* root = newnode(0);
root->right = newnode(1);
root->right->right = newnode(0);
root->left = newnode(0);
int K = 0;
// Function call to check
// binary tree
bool result
= connectedK(root, NULL,
K, true);
if (result == false)
cout << "False\n";
else
cout << "True\n";
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Defining tree node
static class node
{
int value;
node right, left;
};
// Utility function to create
// a new node
static node newnode(int key)
{
node temp = new node();
temp.value = key;
temp.right = null;
temp.left = null;
return temp;
}
// Function to check binary
// tree whether its every node
// has value K or, it is
// connected with node having
// value K
static boolean connectedK(node root,
node parent,
int K,
boolean flag)
{
// Checking node value
if (root.value != K)
{
// Checking the left
// child value
if (root.left == null ||
root.left.value != K)
{
// Checking the rigth
// child value
if (root.right == null ||
root.right.value != K)
{
// Checking the parent value
if (parent == null ||
parent.value != K)
{
flag = false;
return flag;
}
}
}
}
// Traversing to the left subtree
if (root.left != null)
{
if (flag == true)
{
flag = connectedK(root.left,
root, K, flag);
}
}
// Traversing to the right subtree
if (root.right != null)
{
if (flag == true)
{
flag = connectedK(root.right,
root, K, flag);
}
}
return flag;
}
// Driver code
public static void main(String[] args)
{
// Input Binary tree
node root = newnode(0);
root.right = newnode(1);
root.right.right = newnode(0);
root.left = newnode(0);
int K = 0;
// Function call to check
// binary tree
boolean result = connectedK(root, null,
K, true);
if (result == false)
System.out.print("False\n");
else
System.out.print("True\n");
}
}
// This code is contributed by Rohit_ranjan
Python3
# Python3 program for the above approach
# Defining tree node
class Node:
def __init__(self,key):
self.value = key
self.left = None
self.right = None
# Function to check binary
# tree whether its every node
# has value K or, it is
# connected with node having
# value K
def connectedK(root, parent, K, flag):
# Checking node value
if root.value != K:
# Checking the left
# child value
if (root.left == None or
root.left.value != K):
# Checking the right
# child value
if (root.right == None or
root.right.value != K):
# Checking the parent value
if (parent == None or
parent.value != K):
flag = False
return flag
# Traversing to the left subtree
if root.left != None:
if flag == True:
flag = connectedK(root.left,
root, K, flag)
# Traversing to the right subtree
if root.right != None:
if flag == True:
flag = connectedK(root.right,
root, K, flag)
return flag
# Driver code
root = Node(0)
root.right = Node(1)
root.right.right = Node(0)
root.left = Node(0)
K = 0
# Function call to check
# binary tree
result = connectedK(root, None, K, True)
if result == False:
print("False")
else:
print("True")
# This code is contributed by Stuti Pathak
C#
// C# program for the above approach
using System;
class GFG{
// Defining tree node
class node
{
public int value;
public node right, left;
};
// Utility function to create
// a new node
static node newnode(int key)
{
node temp = new node();
temp.value = key;
temp.right = null;
temp.left = null;
return temp;
}
// Function to check binary
// tree whether its every node
// has value K or, it is
// connected with node having
// value K
static bool connectedK(node root,
node parent,
int K,
bool flag)
{
// Checking node value
if (root.value != K)
{
// checking the left
// child value
if (root.left == null ||
root.left.value != K)
{
// Checking the rigth
// child value
if (root.right == null ||
root.right.value != K)
{
// Checking the parent value
if (parent == null ||
parent.value != K)
{
flag = false;
return flag;
}
}
}
}
// Traversing to the left subtree
if (root.left != null)
{
if (flag == true)
{
flag = connectedK(root.left,
root, K, flag);
}
}
// Traversing to the right subtree
if (root.right != null)
{
if (flag == true)
{
flag = connectedK(root.right,
root, K, flag);
}
}
return flag;
}
// Driver code
public static void Main(String[] args)
{
// Input Binary tree
node root = newnode(0);
root.right = newnode(1);
root.right.right = newnode(0);
root.left = newnode(0);
int K = 0;
// Function call to check
// binary tree
bool result = connectedK(root, null,
K, true);
if (result == false)
Console.Write("False\n");
else
Console.Write("True\n");
}
}
// This code is contributed by Princi Singh
输出:
True
时间复杂度: O(N),N是树的节点数。
辅助空间: O(1)