数据结构 二叉树,找出结点值为X的点,并删除它的子树。我做完了,可不知为什么没效果,高手改下,谢谢

论坛 期权论坛 期权     
xyq05862810   2018-4-29 12:01   2826   4
#include
#include
#include
const N=10;
typedef char elemtype;

struct bnode
{
   elemtype data;
   struct bnode *lchild,*rchild;
};
int top1;
int top2;
char a[20];
struct bnode* q[20];

void ...#include
#include
#include
const N=10;
typedef char elemtype;

struct bnode
{
   elemtype data;
   struct bnode *lchild,*rchild;
};
int top1;
int top2;
char a[20];
struct bnode* q[20];

void push(struct bnode *p,int m)
{
if(top1==N||top2==N)
  coutlchild;}
      p=new(bnode);
      p->data=d; p->lchild=NULL; p->rchild=NULL;
      if (d>q->data)  q->rchild=p;
      else q->lchild=p;
   }
   return t;
}
void last_order(struct bnode *t)
{
   if (t!=NULL)
   {
      last_order(t->lchild);
   last_order(t->rchild);
      coutdata==x)
     {
      p=q[top1-1];
      if (p->lchild->data==x) p->lchild=NULL;
      if (p->rchild->data==x) p->rchild=NULL;
     }
    }

   }

}
}
void main()
{
   struct bnode *root;
   char x;
//  srand((unsigned)time(NULL));
   root=set_tree();
   cout
分享到 :
0 人收藏

4 个回复

倒序浏览
2#
qfwu  1级新秀 | 2018-4-30 01:03:52
改程序最麻烦了,这里还没有任何注释。
我建议你先理清思路:
数据结构是
struct bnode
{
   elemtype data;
   struct bnode *lchild,*rchild;
};
不知道你的二叉树是前序、后序还是中序的呢?只要确保X不会重复,无序也没关系的。则可以生成后编写一个查找x所在结点的函数:
struct bnode *find(struct bnode *root, elemtype x)
{
      struct bnode *ptr=null;
      while(root!=null)
           if(root->data! =x)
           {
                ptr=find(root->lchild);//在左子树中查找,找到就跳出循环。这是递归过程。
                if(!ptr)
                   break;
                ptr=find(root->rchild));//在右子树中查找,找到就跳出循环。
                if(!ptr)
                   break;
           }
           else
                ptr=root;//根结点的内容是x
      return(ptr);//ptr非空就是找到了的内容为x的结点的指针,否则没找到。
}
然后删除过程如下:
del_subtree(struct bnode *x)
{
     if(x!=null)//x非空就需要删除
     {
         del_subtree(x->lchild);//删除左子树
         del_subtree(x->rchild);//删除右子树
         free(x);//释放结点内存,完成对树的删除
    }
}
主程序中写:
ptr=find(root,x);
del_subtree(ptr);
这是递归的方法,很简明。
你似乎用的是将递归转化为递推的方法,有执行效率却有难度。
还是第一再看书学习一下,检查一下算法对不对。
第二对程序单步执行,观察变量的变化情况,这是最强有力的程序调试方法。
3#
陈宗权  2级吧友 | 2018-4-30 01:03:53
void Del_x(struct bnode *t,char x);
你在main函数中调用Del_x(root,x);只是把root的值复制了一份给t,这意味着你在函数中无论如何给t赋值,root的值丝毫不会改变。
另外,你在函数中还用了一个p=t来过渡,之后一直是对p进行操作了,这样连t的值都不会改变,更不用说root的值了,root和t的指向(目的地)在程序执行期间永远不会改变。
4#
nglfub  2级吧友 | 2018-4-30 01:03:54
你给的例子本来就不是一棵二叉查找树,10本来就比40小,是不允许放到40的右子树上的的,二叉查找树的每棵子树都要求是二叉查找树

课本上讲的应该是对的,只不过你的树不是二叉查找树
5#
┲﹊怅惘◆﹏  1级新秀 | 2018-4-30 01:03:55
= =、好厉害
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP