每日几题2

问题一:给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树。

#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;

typedef struct node{
 char data;
 struct node *lchild;
 struct node *rchild;
}BTNode;
#define MAXSIZE 100

void ShortestTree(BTNode *&b,char a[],int low,int high)
{
 //用一组数据构造最小高度的树,当树的左孩子和右孩子有相同高度时,树最低。
 //所以以数据的第一个元素构造根结点,剩下的元素分成两半,用左半部分构造树的左孩子,用右半部分以相同的方法构造树的右孩子
  if(low<=high)
  {
    int i=low,j=high;
    b=new BTNode();
 b->data=a[i];
 b->lchild=b->rchild=NULL;
 ShortestTree(b->lchild,a,i+1,(i+j+1)/2);
 ShortestTree(b->rchild,a,(i+j+1)/2+1,j);
 
  }

}
void ShortestTree2(BTNode *&b,char a[],int low,int high)
{
 //思想同ShortestTree,只是以数组的中间元素构造根结点,此时如果数据是有序的,则构造出来的构不仅高度最低,而且中序遍历的结果也是有序树
 //考虑是否可以用此方法构造平衡二叉树
 if(low<=high)
  {
    int i=low,j=high;
 int m=(i+j)/2;
    b=new BTNode();
 b->data=a[m];
 b->lchild=b->rchild=NULL;
 ShortestTree2(b->lchild,a,i,m-1);
 ShortestTree2(b->rchild,a,m+1,j);
 
  }
}

问题二:给定一棵二叉树,要求按分层遍历该二叉树,每一层要求访问顺序从左到右,一层以换行结尾。

void PrintNodeAtLevel(BTNode *b)
{
 //将树按层次遍历,每层结点占一行
 if(b==NULL)
  return ;
 vector<BTNode*> vec;
 vec.push_back(b);
 int cur=0;
 int last;
 while(cur<vec.size())
 {
   last=vec.size();
   while(cur<last)
   {
    cout<<vec[cur]->data<<" ";
    if(vec[cur]->lchild)
     vec.push_back(vec[cur]->lchild);
    if(vec[cur]->rchild)
     vec.push_back(vec[cur]->rchild);
       cur++;
   }
  cout<<endl;
 }

}

 

问题三,给定一棵二叉树,设计算法,将每一层的所有结点构建为一个链表(也就是说,如果树有D层,那么你将构建出D个链表)

void LinkNodeAtLevel(BTNode *b)
{
 //将树的每层组织成一个链表,基本思想如PrintNodeAtLevel
 if(b==NULL)
  return ;
 vector<BTNode*> vec;
 typedef struct node{
 BTNode* nodes;
 struct node *next;
 }LinkList;  //链表中元素的基本类型定义
 vector<LinkList*> vList;//存储每层形成的链表
 vec.push_back(b);
 int cur=0;
 int last;
 while(cur<vec.size())
 {
      int index=cur;
   last=vec.size();
   while(cur<last)
   {
   
    if(vec[cur]->lchild)
     vec.push_back(vec[cur]->lchild);
    if(vec[cur]->rchild)
     vec.push_back(vec[cur]->rchild);
       cur++;
   }
   LinkList *head,*p,*r;
   int flag=0;
   for(int i=index;i<cur;i++)
   {
     if(flag==0)
  {
   head=new LinkList();
   head->nodes=vec[i];
   head->next=NULL;
   r=head;
   flag=1;
  }
  else{
   p=new LinkList();
   p->nodes=vec[i];
    p->next=r->next;
   r->next=p;
   r=p;
  }
  
   }//  尾插法构建链表。
   vList.push_back(head);
  cout<<endl;
 }
 for(vector<LinkList*>::iterator iter=vList.begin();iter!=vList.end();iter++)
 {
      LinkList *h=*iter;
   while(h!=NULL)
   {
    cout<<h->nodes->data<<" ";
    h=h->next;
   }
   cout<<endl;
 }//输出所构建链表的元素,即按树的层次输出。输出结果同上一题输出结果
}

 

int BTNodeHeight(BTNode *b)//求数的高度
{
 if(b==NULL)
  return 0;
 else if(b->lchild==NULL&&b->rchild==NULL)
  return 1;
 else
  return BTNodeHeight(b->lchild)>BTNodeHeight(b->rchild)?(BTNodeHeight(b->lchild)+1):(BTNodeHeight(b->rchild)+1);
}

主程序如下:

int main()
{
      BTNode *b=NULL;
     char *str="1234567" ;
  ShortestTree2(b,str,0,6);
       PrintNodeAtLevel(b);
  cout<<endl;
  LinkNodeAtLevel(b);
  cout<<endl;
  cout<<"树的高度为:"<<BTNodeHeight(b)<<endl;
 return 0;
}
 

posted @ 2013-09-11 21:42  sumile  阅读(230)  评论(0)    收藏  举报