每日几题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;
}
浙公网安备 33010602011771号