要求:结点删除后其唯一的子节点代替它的位置。
这里用到了递归的方法,不断遍历每个节点的左右子树,将度数为一的结点删除。
#include <iostream>
using namespace std;
struct Node
{
int v;
Node* left;
Node* right;
};
void print_div(int p)
{
for(int i=0; i < p; i++)
{
cout<<"-";
}
}
void print_tree(Node* node, int p)
{
if(node != NULL)
{
print_div(p);
cout<<node->v<<endl;
if(node->left != NULL || node->right != NULL)
{
print_tree(node->left, p+1);
print_tree(node->right, p+1);
}
}
else
{
print_div(p);
cout<<endl;
}
}
void print_tree(Node* node)
{
print_tree(node, 0);
}
void delete_one_degree_node(Node*& node)
{
if(node == NULL)
return;
if(node->left != NULL && node->right == NULL) //只有左子树
{
node = node->left;
delete_one_degree_node(node);
}
else if(node->right != NULL && node->left == NULL) //只有右子树
{
node = node->right;
delete_one_degree_node(node);
}
else if(node->left != NULL && node->right != NULL) //左右子树均存在
{
delete_one_degree_node(node->left);
delete_one_degree_node(node->right);
}
}
int main()
{
Node n[10] = {0};
Node* tree = n;
for(int i=0; i < 10; i++)
{
n[i].v = i;
}
tree[0].left = &tree[1];
tree[0].right = &tree[2];
tree[1].left = &tree[3];
tree[1].right = &tree[4];
tree[2].left = NULL;
tree[2].right = &tree[6];
tree[3].left = &tree[7];
tree[3].right = &tree[8];
tree[4].left = &tree[9];
cout<<"Original:"<<endl;
print_tree(tree);
delete_one_degree_node(tree);
cout<<"After:"<<endl;
print_tree(tree);
return 0;
}