#include<iostream>
using namespace std;
using namespace std;
typedef struct TreeNode {
int data;
TreeNode* ltree=NULL, * rtree=NULL;
}TreeNdoe;
typedef struct TreeNode* Tree;
void Crtree(Tree &root) {
root = (Tree)malloc(sizeof(TreeNode));
root->ltree = root->rtree = NULL;
int n;
cin >> root->data;
Tree p,node;
while (cin >> n && n != 0) {
p = root;
node = (Tree)malloc(sizeof(TreeNode));
node->data = n;
node->ltree = node->rtree = NULL;
while (1) {
if (n < p->data) {
if (p->ltree == NULL) {
p->ltree = node;
break;
}
p = p->ltree;
}
else {
if (p->rtree == NULL) {
p->rtree = node;
break;
}
p = p->rtree;
}
}
}
}
void DelNode(Tree& root) {
int n,count1=0;
cin >> n;
Tree node = root,pre1=NULL;
while (node != NULL && node->data != n) {
count1++;
pre1 = node;
if (n > node->data) {
node = node->rtree;
}
else {
node = node->ltree;
}
}
if (node->ltree) {
Tree p = node->ltree, pre = NULL;
int count = 0;
while (p->rtree) {
pre = p;
count++;
p = p->rtree;
}
node->data = p->data;
if (count == 0)
node->ltree = NULL;
else
pre->rtree = NULL;
}
else {
if (node->rtree) {
if (count1 == 0) {
root = root->rtree;
}
else {
if (pre1->data > node->data) {
pre1->ltree = node->rtree;
}
else {
pre1->rtree = node->rtree;
}
}
}
else {
if (count1 == 0) {
root = NULL;
}
else {
if (pre1->data > node->data) {
pre1->ltree = node->rtree;
}
else {
pre1->rtree = node->rtree;
}
}
}
}
}
void ForOrderCout(Tree root) {
if (root == NULL) {
cout << "# ";
return;
}
cout << root->data << " ";
ForOrderCout(root->ltree);
ForOrderCout(root->rtree);
}
void MidOrderCout(Tree root) {
if (root != NULL) {
MidOrderCout(root->ltree);
cout << root->data<<' ';
MidOrderCout(root->rtree);
}
}
int FindFloor(Tree root,int num,int floor) {
if (root == NULL)
return 0;
if (root->data == num)
return floor;
int count1 = FindFloor(root->ltree , num, floor+1);
int count2 = FindFloor(root->rtree, num, floor+1);
return count1 > count2 ? count1 : count2;
}
int main() {
Tree root;
Crtree(root);
ForOrderCout(root);
cout << endl;
DelNode(root);
MidOrderCout(root);
cout << endl;
int num;
cin >> num;
cout<<FindFloor(root,num,1);
return 0;
}
这道题与树有关,许多地方用到了递归。难点在于节点删除,要考虑该节点是否有左子树,如果有的话左子树是否有右子树。如果没有左子树的话是否有右子树和该节点是否为根节点。