给定一棵通用树,任务是从树中删除叶节点。
例子:
Input:
5
/ / \ \
1 2 3 8
/ / \ \
15 4 5 6
Output:
5 : 1 2 3
1 :
2 :
3 :
Explanation:
Deleted leafs are:
8, 15, 4, 5, 6
Input:
8
/ | \
9 7 2
/ | \ | / / | \ \
4 5 6 10 11 1 2 2 3
Output:
8: 9 7 2
9:
7:
2:
方法:按照以下步骤解决问题
- 将树插入向量中。
- 遍历树并检查条件:
- 如果当前节点是叶子,则
- 从向量中删除叶子
- 别的
- 递归调用每个孩子。
下面是上述方法的实现:
C++
// C++ program to delete the
// leaf from the generic tree
#include
using namespace std;
// a treenode class
class TreeNode {
public:
int data;
vector children;
TreeNode(int data)
{
this->data = data;
}
};
// Recursive function which delete
// the leaf from tree
void removeLeaf(TreeNode* root)
{
// if root->children is a leaf node
// then delete it from children vector
for (int i = 0;
i < root->children.size();
i++) {
TreeNode* child
= root->children[i];
// if it is a leaf
if (child->children.size() == 0) {
// shifting the vector to left
// after the point i
for (int j = i;
j < root->children.size();
j++)
root->children[j]
= root->children[j + 1];
// delete the last element
root->children.pop_back();
i--;
}
}
// Remove all leaf node
// of children of root
for (int i = 0;
i < root->children.size();
i++) {
// call function for root->children
removeLeaf(root->children[i]);
}
}
// Function which will print the
// tree level wise
void printTheTree(TreeNode* root)
{
if (root == NULL)
return;
cout << root->data << " "
<< ":";
for (int i = 0;
i < root->children.size();
i++)
cout << root->children[i]->data
<< " ";
cout << endl;
for (int i = 0;
i < root->children.size();
i++)
printTheTree(root->children[i]);
}
// Driver code
int main()
{
// 5
// / / \ \
// 1 2 3 8
// / /\ \
// 15 4 5 6
TreeNode* root = new TreeNode(5);
TreeNode* child1 = new TreeNode(1);
root->children.push_back(child1);
TreeNode* child11 = new TreeNode(15);
child1->children.push_back(child11);
TreeNode* child2 = new TreeNode(2);
root->children.push_back(child2);
TreeNode* child21 = new TreeNode(4);
TreeNode* child22 = new TreeNode(5);
child2->children.push_back(child21);
child2->children.push_back(child22);
TreeNode* child3 = new TreeNode(3);
root->children.push_back(child3);
TreeNode* child31 = new TreeNode(6);
child3->children.push_back(child31);
TreeNode* child4 = new TreeNode(8);
root->children.push_back(child4);
removeLeaf(root);
printTheTree(root);
}
Java
// Java program to delete the
// leaf from the generic tree
import java.util.*;
class GFG
{
// a treenode class
static class TreeNode {
int data;
ArrayList children;
TreeNode(int data)
{
this.data = data;
this.children = new ArrayList<>();
}
};
// Recursive function which delete
// the leaf from tree
static void removeLeaf(TreeNode root)
{
// if root.children is a leaf node
// then delete it from children vector
for (int i = 0; i < root.children.size(); i++) {
TreeNode child= root.children.get(i);
// if it is a leaf
if (child.children.size() == 0) {
// shifting the vector to left
// after the point i
for (int j = i; j < root.children.size() - 1; j++)
root.children.set(j, root.children.get(j + 1));
// delete the last element
root.children.remove(root.children.size()-1);
i--;
}
}
// Remove all leaf node
// of children of root
for (int i = 0;
i < root.children.size();
i++) {
// call function for root.children
removeLeaf(root.children.get(i));
}
}
// Function which will print the
// tree level wise
static void printTheTree(TreeNode root)
{
if (root == null)
return;
System.out.print(root.data+" :");
for (int i = 0; i < root.children.size(); i++)
System.out.print(root.children.get(i).data+" ");
System.out.println();
for (int i = 0; i < root.children.size(); i++)
printTheTree(root.children.get(i));
}
// Driver code
public static void main(String []args)
{
// 5
// / / \ \
// 1 2 3 8
// / /\ \
// 15 4 5 6
TreeNode root = new TreeNode(5);
TreeNode child1 = new TreeNode(1);
root.children.add(child1);
TreeNode child11 = new TreeNode(15);
child1.children.add(child11);
TreeNode child2 = new TreeNode(2);
root.children.add(child2);
TreeNode child21 = new TreeNode(4);
TreeNode child22 = new TreeNode(5);
child2.children.add(child21);
child2.children.add(child22);
TreeNode child3 = new TreeNode(3);
root.children.add(child3);
TreeNode child31 = new TreeNode(6);
child3.children.add(child31);
TreeNode child4 = new TreeNode(8);
root.children.add(child4);
removeLeaf(root);
printTheTree(root);
}
}
// This code is contributed by rutvik_56
Python3
# Python program to delete the
# leaf from the generic tree
# a treenode class
class TreeNode:
def __init__(self, data):
self.data = data
self.children = []
# Recursive function which delete
# the leaf from tree
def removeLeaf(root):
# if root.children is a leaf node
# then delete it from children vector
i = 0
while i < len(root.children):
child = root.children[i]
# if it is a leaf
if (len(child.children) == 0):
# shifting the vector to left
# after the point i
for j in range(i, len(root.children) - 1):
root.children[j] = root.children[j + 1]
# delete the last element
root.children.pop()
i -= 1
i += 1
# Remove all leaf node
# of children of root
for i in range(len(root.children)):
# call function for root.children
removeLeaf(root.children[i])
# Function which will print the
# tree level wise
def printTheTree(root):
if (root == None):
return
print("{} :".format(root.data), end="")
for i in range(len(root.children)):
print("{} ".format(root.children[i].data), end="")
print()
for i in range(len(root.children)):
printTheTree(root.children[i])
# Driver code
if __name__ == "__main__":
# 5
# / / \ \
# 1 2 3 8
# / /\ \
# 15 4 5 6
root = TreeNode(5)
child1 = TreeNode(1)
root.children.append(child1)
child11 = TreeNode(15)
child1.children.append(child11)
child2 = TreeNode(2)
root.children.append(child2)
child21 = TreeNode(4)
child22 = TreeNode(5)
child2.children.append(child21)
child2.children.append(child22)
child3 = TreeNode(3)
root.children.append(child3)
child31 = TreeNode(6)
child3.children.append(child31)
child4 = TreeNode(8)
root.children.append(child4)
removeLeaf(root)
printTheTree(root)
# This code is contributed by sanjeev2552
C#
// C# program to delete the
// leaf from the generic tree
using System;
using System.Collections;
using System.Collections.Generic;
class GFG
{
// a treenode class
class TreeNode {
public int data;
public ArrayList children;
public TreeNode(int data)
{
this.data = data;
this.children = new ArrayList();
}
};
// Recursive function which delete
// the leaf from tree
static void removeLeaf(TreeNode root)
{
// if root.children is a leaf node
// then delete it from children vector
for (int i = 0; i < root.children.Count; i++) {
TreeNode child= (TreeNode)root.children[i];
// if it is a leaf
if (child.children.Count == 0) {
// shifting the vector to left
// after the point i
for (int j = i; j < root.children.Count - 1; j++)
{
root.children[j]= root.children[j + 1];
}
// delete the last element
root.children.RemoveAt(root.children.Count - 1);
i--;
}
}
// Remove all leaf node
// of children of root
for (int i = 0; i < root.children.Count; i++)
{
// call function for root.children
removeLeaf((TreeNode)root.children[i]);
}
}
// Function which will print the
// tree level wise
static void printTheTree(TreeNode root)
{
if (root == null)
return;
Console.Write(root.data+" :");
for (int i = 0; i < root.children.Count; i++)
Console.Write(((TreeNode)root.children[i]).data + " ");
Console.WriteLine();
for (int i = 0; i < root.children.Count; i++)
printTheTree((TreeNode)root.children[i]);
}
// Driver code
public static void Main(string []args)
{
// 5
// / / \ \
// 1 2 3 8
// / /\ \
// 15 4 5 6
TreeNode root = new TreeNode(5);
TreeNode child1 = new TreeNode(1);
root.children.Add(child1);
TreeNode child11 = new TreeNode(15);
child1.children.Add(child11);
TreeNode child2 = new TreeNode(2);
root.children.Add(child2);
TreeNode child21 = new TreeNode(4);
TreeNode child22 = new TreeNode(5);
child2.children.Add(child21);
child2.children.Add(child22);
TreeNode child3 = new TreeNode(3);
root.children.Add(child3);
TreeNode child31 = new TreeNode(6);
child3.children.Add(child31);
TreeNode child4 = new TreeNode(8);
root.children.Add(child4);
removeLeaf(root);
printTheTree(root);
}
}
// This code is contributed by pratham76
输出:
5 :1 2 3
1 :
2 :
3 :