📜  删除值为 x 的叶节点

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

删除值为 x 的叶节点

给定一棵二叉树和一个目标整数 x,删除所有值为 x 的叶节点。另外,删除新形成的叶子,目标值为x。
例子:

Input : x = 5  
            6
         /     \
        5       4
      /   \       \
     1     2       5 
Output : 
            6
         /     \
        5       4
      /   \  
     1     2 
Inorder Traversal is 1 5 2 6 4

资料来源:微软专访
我们以后序方式遍历树并递归删除节点。该方法与this和this问题非常相似。

C++
// CPP code to delete all leaves with given
// value.
#include 
using namespace std;
 
// A binary tree node
struct Node {
    int data;
    struct Node *left, *right;
};
 
// A utility function to allocate a new node
struct Node* newNode(int data)
{
    struct Node* newNode = new Node;
    newNode->data = data;
    newNode->left = newNode->right = NULL;
    return (newNode);
}
 
Node* deleteLeaves(Node* root, int x)
{
    if (root == NULL)
        return nullptr;
    root->left = deleteLeaves(root->left, x);
    root->right = deleteLeaves(root->right, x);
 
    if (root->data == x && root->left == NULL &&
                          root->right == NULL) {
        
        return nullptr;
    }
    return root;
}
 
void inorder(Node* root)
{
    if (root == NULL)
        return;
    inorder(root->left);
    cout << root->data << " ";
    inorder(root->right);
}
 
// Driver program
int main(void)
{
    struct Node* root = newNode(10);
    root->left = newNode(3);
    root->right = newNode(10);
    root->left->left = newNode(3);
    root->left->right = newNode(1);
    root->right->right = newNode(3);
    root->right->right->left = newNode(3);
    root->right->right->right = newNode(3);
    deleteLeaves(root, 3);
    cout << "Inorder traversal after deletion : ";
    inorder(root);
    return 0;
}


Java
// Java code to delete all leaves with given
// value.
class GfG {
 
// A binary tree node
static class Node {
    int data;
    Node left, right;
}
 
// A utility function to allocate a new node
static Node newNode(int data)
{
    Node newNode = new Node();
    newNode.data = data;
    newNode.left = null;
    newNode.right = null;
    return (newNode);
}
 
static Node deleteLeaves(Node root, int x)
{
    if (root == null)
        return null;
    root.left = deleteLeaves(root.left, x);
    root.right = deleteLeaves(root.right, x);
 
    if (root.data == x && root.left == null && root.right == null) {
 
        return null;
    }
    return root;
}
 
static void inorder(Node root)
{
    if (root == null)
        return;
    inorder(root.left);
    System.out.print(root.data + " ");
    inorder(root.right);
}
 
// Driver program
public static void main(String[] args)
{
    Node root = newNode(10);
    root.left = newNode(3);
    root.right = newNode(10);
    root.left.left = newNode(3);
    root.left.right = newNode(1);
    root.right.right = newNode(3);
    root.right.right.left = newNode(3);
    root.right.right.right = newNode(3);
    deleteLeaves(root, 3);
    System.out.print("Inorder traversal after deletion : ");
    inorder(root);
}
}


Python3
# Python3 code to delete all leaves
# with given value.
 
# A utility class to allocate a new node
class newNode:
    def __init__(self, data):
        self.data = data
        self.left = self.right = None
 
def deleteLeaves(root, x):
    if (root == None):
        return None
    root.left = deleteLeaves(root.left, x)
    root.right = deleteLeaves(root.right, x)
 
    if (root.data == x and
        root.left == None and
        root.right == None):
        return None
    return root
 
def inorder(root):
    if (root == None):
        return
    inorder(root.left)
    print(root.data, end = " ")
    inorder(root.right)
 
# Driver Code
if __name__ == '__main__':
    root = newNode(10)
    root.left = newNode(3)
    root.right = newNode(10)
    root.left.left = newNode(3)
    root.left.right = newNode(1)
    root.right.right = newNode(3)
    root.right.right.left = newNode(3)
    root.right.right.right = newNode(3)
    deleteLeaves(root, 3)
    print("Inorder traversal after deletion : ")
    inorder(root)
 
# This code is contributed by PranchalK


C#
// C# code to delete all leaves with given
// value.
using System;
     
class GfG
{
 
    // A binary tree node
    class Node
    {
        public int data;
        public Node left, right;
    }
 
    // A utility function to allocate a new node
    static Node newNode(int data)
    {
        Node newNode = new Node();
        newNode.data = data;
        newNode.left = null;
        newNode.right = null;
        return (newNode);
    }
 
    static Node deleteLeaves(Node root, int x)
    {
        if (root == null)
            return null;
        root.left = deleteLeaves(root.left, x);
        root.right = deleteLeaves(root.right, x);
 
        if (root.data == x &&
            root.left == null &&
            root.right == null)
        {
 
            return null;
        }
        return root;
    }
 
    static void inorder(Node root)
    {
        if (root == null)
            return;
        inorder(root.left);
        Console.Write(root.data + " ");
        inorder(root.right);
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        Node root = newNode(10);
        root.left = newNode(3);
        root.right = newNode(10);
        root.left.left = newNode(3);
        root.left.right = newNode(1);
        root.right.right = newNode(3);
        root.right.right.left = newNode(3);
        root.right.right.right = newNode(3);
        deleteLeaves(root, 3);
        Console.Write("Inorder traversal after deletion : ");
        inorder(root);
    }
}
 
// This code is contributed by PrinciRaj1992


Javascript


输出:

Inorder traversal after deletion : 3 1 10 10