uva548 二叉树有关问题 Runtime Error看过来
uva548 二叉树问题 Runtime Error看过来!
第一次练习二叉树的相关操作,还是很有收获,期间遇到了几个问题。
1、在delete节点时判断if(pNode==NULL)没用,不清楚为何,遂改了写法
2、全局变量写在类外时,类内的函数不能直接用,如果定义在类内是可以的,只不过在main函数中要加tree.引用
3、看网上的做法都是先建树,再dfs求路径最短,而我定义了一个sum域,保存根节点到该节点的路径和,如果判断该节点是叶子节点,则将sum与最小值Min比较,同时将节点加入vector中,进而可以求得路径和相同时哪个叶子节点的id最小。
4、注意动态数组申请及释放的写法,第一次就写错了!int* arr=new int【maxn】,delete【】arr;
5、runtime error就不知道该怎么改了。。。
#include<iostream> #include<cstring> #include<vector> using namespace std; struct Node { int id; int sum; Node* left; Node* right; }; class Tree { public: Node* root; vector<Node*> nvec; int Min; Tree(){root=new Node;Min=10000;} void clear(Node* pNode); ~Tree(){clear(root);} void build(Node* pNode,int n,int sum,int* s1,int* s2);//s1后序遍历,s2中序遍历 void convert(int* arr,int len); int indexof(int* arr,int tar); }; int Tree::indexof(int* arr,int tar) { int i=0; while(1) { if (arr[i]==tar) { return i; } i++; } } void Tree::convert(int* arr,int len) { for (int i=0;i<len/2;i++) { int tmp=arr[i]; arr[i]=arr[len-1-i]; arr[len-1-i]=tmp; } } void Tree::clear(Node* pNode) { if (pNode->id<0) delete pNode; else { clear(pNode->left); clear(pNode->right); } } void Tree::build(Node* pNode,int n,int sum,int* s1,int* s2) { if (n<=0) { pNode=NULL; return; } pNode->id=s1[0]; pNode->sum=sum+pNode->id; int p=indexof(s2,s1[0]); if (p<=0&&n-p-1<=0) { nvec.push_back(pNode); if (pNode->sum<=Min) { Min=pNode->sum; } } pNode->left= new Node; pNode->right= new Node; build(pNode->right,n-p-1,pNode->sum,s1+1,s2+p+1); build(pNode->left,p,pNode->sum,s1+n-p,s2); } #define MAXN 10001 int main() { int tmp; while(cin>>tmp) { int *inorder=new int[MAXN]; int *postorder=new int[MAXN]; inorder[0]=tmp; int dex=1; char ch=cin.get(); while(ch==' ') { cin>>inorder[dex++]; ch=cin.get(); } for (int i=0;i<dex;i++) { cin>>postorder[i]; } Tree tree; tree.convert(postorder,dex); tree.build(tree.root,dex,0,postorder,inorder); int* nodevalue=new int[MAXN]; int index=0; for (int i=0;i<tree.nvec.size();i++) { if (tree.nvec[i]->sum==tree.Min) { nodevalue[index++]=tree.nvec[i]->id; } } int min=nodevalue[0]; for (int j=0;j<index;j++) { if (nodevalue[j]<min) min=nodevalue[j]; } cout<<min<<endl; delete[] inorder; delete[] postorder; delete[] nodevalue; } return 0; }