C++实现最优二叉树(修改版)

9 篇文章 0 订阅
#include<iostream.h>

struct Node{
int num;
Node *next;
Node *LChild;
Node *RChild;
};
void Print(Node *a)  
{  
    Node *p=a->next;  
    while(p!=NULL)  
    {  
      cout<<p->num<<endl;   
      p=p->next;  
    }  
}
Node *Init()
{
	int n=0;
	Node * p1,*p2,*head;
	//Node *p1,p2,head和这个声明不同
	head=NULL;
	p1=new Node;
    p2=new Node;
	head=new Node;
	head->next=p2;
	head->LChild=NULL;
	head->RChild=NULL;
	cout<<"input a num"<<endl;
	cin>>p2->num;
	while(1)
	{
		    cout<<"input a num"<<endl;
			cin>>p1->num;
			if(p1->num==0)
			{
                p2->next=NULL;
				break;
			}
			p1->next=NULL;
			//	系统保证指向空指针的地方不指向任何函数或变量
		    p2->next=p1;
		    p2=p1;
			p1=new Node;
			p1->LChild=NULL;
        	p1->RChild=NULL;
	}
	//p2=NULL并没有作用,是因为改变的是p2指针的值,而p2指针指向的地方的值没变
    //	p2=NULL;
	cout<<"after"<<endl;
	return head;
}
void Insert(Node *a,Node *Temp)
{
	cout<<"Temp->num"<<endl;
	cout<<Temp->num<<endl;
	Temp->next=a->next;
	a->next=Temp;
}
void Delete(Node *a,int Temp)
{
	int b=Temp;
	int n=0;
    Node *p=a;
	Node *p1=p->next;
    while(p1!=NULL)
	{
     if(p1->num==b)
	 {
		 p->next=p1->next;
		 n=1;
		 delete p1;
         break;
	 }
	 p=p1;
	 p1=p1->next;
	}
}
Node *MAX(Node *p1,Node *p2)
{
  return  p1->num>p2->num?p1:p2;
}
Node *Creat(Node *a)
{
   Node *p1,*p2;
   p1=new Node;
   p2=new Node;
   Node *TP;
   TP=new Node;
   Node *NewTP;
   NewTP=new Node;
   int count=0;
   Node *pp=a->next;
   while(pp!=NULL)
   {
	   count++;
	   pp=pp->next;
	  
   }
   cout<<"共有"<<count<<"个节点"<<endl;
   if(count==1)
   {
	    Node *ReTurn=new Node;
		cout<<"a->next->num"<<a->next->num<<endl; 
		ReTurn=a;
        return ReTurn;
   }
    if(count==2)
	{
        p1=a->next;
		cout<<p1->num<<endl;
        p2=a->next->next;
		cout<<p2->num<<endl;
		NewTP=new Node;
        NewTP->num=p1->num+p2->num;
		cout<<NewTP->num<<endl;
        NewTP->LChild=p1;
        NewTP->RChild=p2;
        Delete(a,p1->num);
        Print(a);
        Delete(a,p2->num);
		Print(a);
        Insert(a,NewTP);
		Print(a);
		Creat(a);
	}
   if(count>=3)
   {
   p1=a->next;
   cout<<"p1=a->next->num"<<p1->num<<endl;
   p2=a->next->next;
   cout<<"p1=a->next->->num"<<p2->num<<endl;
   TP=a->next->next->next;
   cout<<"tp=a->next->->num"<<TP->num<<endl;
   int n=0;
   while(TP!=NULL)
   {
     if(TP->num<MAX(p1,p2)->num)
	 {
		 if(MAX(p1,p2)==p1)
		 {
		   cout<<"MAX(p1,p2)==p1"<<endl;
		   p1=TP;
		   cout<<"p1->num="<<p1->num<<endl;
		   TP=TP->next;
		    n++;
		   continue;
		 }
		 if(MAX(p1,p2)==p2)
		 {
			  cout<<"MAX(p1,p2)==p2"<<endl;
		   p2=TP;
		    cout<<"p2->num"<<p2->num<<endl;
			TP=TP->next;
			 n++;
		   continue;
		 }
		  
	 }
	 TP=TP->next;
	 n++;
   }
   cout<<"out"<<endl;
   NewTP->num=p1->num+p2->num;
   NewTP->LChild=p1;
   NewTP->RChild=p2;
   Delete(a,p1->num);
   Delete(a,p2->num);
   Insert(a,NewTP);
cout<<"out11"<<endl;
   Creat(a);
   }
}

void main()
{
	Node *a;
	Node *b;
	//
	a=new Node;
    //不加a=new Node;  直接	cout<<a->num<<endl; 就会出错,因为还没初始化
	a=Init();
	 
	 cout<<endl;
	 cout<<endl;
	 cout<<endl;
	
	 Print(a);
	
	 cout<<endl;
	 cout<<endl;
	 cout<<endl;
	
	 b=Creat(a);
     
	 cout<<b->next->num<<endl;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值