思想:
只要能删除其左,右子树就能释放值为x的结点,后序遍历删除。
层序遍历查找值为k的父节点。
需要完整遍历整科二叉树,所以时间复杂度是O(n)
删除代码
void DeleteTree(Tree &Q){
if(Q==NULL)
return; //递归终止条件
DeleteTree(Q->lchild);
DeleteTree(Q->rchild);
free(Q);
}
查找代码
void Findxdelete(Tree &T,int k){
if(T==NULL){
return;
}
queue<Tree> Q;
Tree cur;
Q.push(T);
if(T->data==k){ //若根结点为k删除整棵树
DeleteTree(T);
exit(0);
}
while(Q.size()!=0){ //层序遍历找值和k相等的结点
cur=Q.front();
Q.pop();
if(cur->lchild){ //查看cur左子树
if(cur->lchild->data==k){ //如果值和cur的左子树相同就删除左子树
DeleteTree(cur->lchild);
cur->lchild=NULL;//将左子树置空
}
else{
Q.push(cur->lchild);//不然将左子树入队,层序遍历
}
}
if(cur->rchild){ //同理
if(cur->rchild->data==k){
DeleteTree(cur->rchild);
cur->rchild=NULL;
}
else{
Q.push(cur->rchild);
}
}
}
}
完整代码
#include<iostream>
#include<stdlib.h>
#include<bits/stdc++.h>
#include<queue>
#define ElemType int
using namespace std;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}TNode,*Tree;
int treenum[]={1,2,4,0,0,5,0,0,3,0,0};
int k;
void createTree(Tree &T,int &k)
{
ElemType n;
// printf("输入为0停止!\n");
// scanf("%d",&n);
if(treenum[k]==0){
T=NULL;
k++;
}
else{
T=new TNode;
T->data=treenum[k];
k++;
// cout<<"T="<<T->data<<"k="<<k<<endl;
createTree(T->lchild,k);
createTree(T->rchild,k);
}
}
void DeleteTree(Tree &Q){
if(Q==NULL)
return; //递归终止条件
DeleteTree(Q->lchild);
DeleteTree(Q->rchild);
free(Q);
}
void Findxdelete(Tree &T,int k){
if(T==NULL){
return;
}
queue<Tree> Q;
Tree cur;
Q.push(T);
if(T->data==k){ //若根结点为k删除整棵树
DeleteTree(T);
exit(0);
}
while(Q.size()!=0){ //层序遍历找值和k相等的结点
cur=Q.front();
Q.pop();
if(cur->lchild){ //查看cur左子树
if(cur->lchild->data==k){ //如果值和cur的左子树相同就删除左子树
DeleteTree(cur->lchild);
cur->lchild=NULL;//将左子树置空
}
else{
Q.push(cur->lchild);//不然将左子树入队,层序遍历
}
}
if(cur->rchild){ //同理
if(cur->rchild->data==k){
DeleteTree(cur->rchild);
cur->rchild=NULL;
}
else{
Q.push(cur->rchild);
}
}
}
}
//先序遍历
int PreTree(Tree &T)
{
if(T==NULL){
return 0;
}
else{
cout<<T->data;
PreTree(T->lchild);
PreTree(T->rchild);
}
}
int main()
{
Tree T;
k=0;
createTree(T,k);
Findxdelete(T,2);
PreTree(T);
return 0;
}
这篇博客介绍了如何使用后序遍历删除二叉树中值为x的节点,以及通过层序遍历查找并删除值为k的节点。提供了完整的C++代码实现,包括创建树、删除节点和层序遍历的功能。主要涉及二叉树操作和数据结构知识。

被折叠的 条评论
为什么被折叠?



