老大要求每周做一个ACM的题,还要写报告,所以,我在这里的第一篇博客就是这个啦~
题目:判断二叉树中某结点是其双亲结点的左孩子还是右孩子
具体要求见下:
Description:
以先序的方式创建一棵二叉树,结点为字符型。给定某结点的值,判断它是其双亲结点的左孩子还是右孩子,如果二叉树无该结点,输出“none”,如果该结点是二叉树的根,输出“root”。
Input Format:
第一行按先序输入扩展二叉树的先序遍历序列
第二行输入一个结点的值
Output format:
输出该结点是其双亲结点的左孩子还是右孩子,如果是左孩子输出“left”,如果是右孩子输出“right”,如果该结点不存在,输出“none”,如果该结点为二叉树的根,输出“root”。
Input Sample:
abdh###e#i##cf##gj###
d
Output Sample:
left
数据结构里最熟悉的就是树这一部分,虽然很久没有敲过了,但还是比较有亲切感~
借用了以前的代码,改动了一些,可以运行出结果,奇怪的是总是出现了Memory Limit Exceed(程序运行时超过题目允许的最大内存),多次改动后仍没有解决问题……哪位仁兄有空可以帮忙看一下哈~~不胜感激!
以下是偶的代码:
//判断某结点是左孩子还是右孩子
#include<iostream>
using namespace std;
struct BiNode
{
char data;
BiNode *lchild,*rchild;
};
class BiTree
{
public:
//BiTree(){root=NULL;}
BiTree();
~BiTree(void);
BiNode *Getroot(); //获得指向根结点的指针
int judge(BiNode *root,char x,BiNode *pre);
private:
BiNode *root; //指向根结点的头指针
void Create(BiNode *&root);
void Release(BiNode *root);
};
int max(int x,int y)
{
return (x>y?x:y);
}
BiTree::BiTree()
{
Create(root);
this->root=root;
}
BiTree::~BiTree(void)
{
Release(root);
}
BiNode * BiTree::Getroot() //返回二叉树的根结点
{
return root;
}
void BiTree::Create(BiNode *&root) //按先序遍历生成一棵二叉树
{
char ch;
cin>>ch;
if(ch=='#')root=NULL;
else
{
root=new BiNode; //生成一个结点
root->data=ch;
Create(root->lchild); //递归建立左子树
Create(root->rchild); //递归建立右子树
}
}
void BiTree::Release(BiNode *root) //释放二叉树占用的空间
{
if(root!=NULL)
{
Release(root->lchild); //释放左子树
Release(root->lchild); //释放左子树
delete root;
}
}
int UnEmpty(int p1,int p2)
{
if(p1!=0)return p1;
else if(p2!=0)return p2;
else return 0;
}
int BiTree::judge(BiNode *root,char x,BiNode *pre)
{
if(root==NULL) return 0;
if(root->data==x)
{
if(pre==NULL) //前一个根结点为空
return 3;
if(pre->lchild==root) //前一个结点的左孩子为root
return 1;
else return 2; //右孩子
}
else
{
pre=root;
return UnEmpty(judge(root->lchild,x,pre),judge(root->rchild,x,pre));
}
}
int main()
{
BiTree tree;
char x;
cin>>x;
BiNode *pre = NULL;
int y=tree.judge(tree.Getroot(),x,pre);
if(y==0)
cout<<"none"<<endl;
else if(y==1)
cout<<"left"<<endl;
else if(y==2)
cout<<"right"<<endl;
else cout<<"root"<<endl;
return 0;
}