原本以为很简单的一个问题,但是写了好长时间,现在总结一下
还是两种情况,递归和非递归情况
递归情况
递归情况下存在一个问题,即在判断的时候容易出现问题。因为判断的时候是比较节点的值是否相等,所以若节点是空的话就会报错。所以我多写了几个if判断,显得很冗杂。需要注意代码中的static的使用
//返回被删除节点的父节点(有问题,不想写了暂时)
BTree* pre_node(BTree *root,BTree *node) {
static BTree* parent = nullptr;
if (root) {
if (root->left != nullptr) {
if (root->val == node->val) {
parent = root;
}
if (root->left->val == node->val) {
parent = root;
}
}
else if (root->right!=nullptr) {
if (root->right->val == node->val) {
parent = root;
}
}
else if (root->left == nullptr && root->right == nullptr) {
parent = root;
}
pre_node(root->left,node);
pre_node(root->right,node);
}
return parent;
}
非递归情况
非递归下可以采用栈来做。
留以后在写