📌  相关文章
📜  检查二叉树的每个节点是否在其自身或其任何直接邻居上都有一个值 K

📅  最后修改于: 2021-09-04 09:41:45             🧑  作者: Mango

给定一棵二叉树和一个值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.

方法:

  1. 这个想法是简单地执行前序遍历并递归地传递父节点的引用。
  2. 在遍历每个节点时检查以下条件:
    • 如果节点的值为 K 或,
    • 如果其父节点值为 K 或,
    • 如果它的任何一个子节点值为 K。
  3. 如果树的任何节点不满足给定的三个条件中的任何一个,则返回 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)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live