平衡二叉树
2015-07-27 22:10
495 查看
//平衡二叉树 #include<stdio.h> #include<stdlib.h> struct TreeNode{ int val; int depth; TreeNode *left,*right; }; void computeDepth(TreeNode *root){ int depth; if(root->left!=NULL) depth=root->left->depth; else depth=0; if(root->right!=NULL && root->right->depth>depth) depth=root->right->depth; root->depth=depth+1; } TreeNode *balance(TreeNode *root){ int leftD,rightD; TreeNode *newRoot; if(root->left!=NULL) leftD=root->left->depth; else leftD=0; if(root->right!=NULL) rightD=root->right->depth; else rightD=0; if(abs(leftD-rightD)<2) return root; if(leftD>rightD) if(root->left->right!=NULL){ newRoot=root->left->right; root->left->right=newRoot->left; newRoot->left=balance(root->left); root->left=newRoot->right; newRoot->right=balance(root); } else{ newRoot=root->left; root->left=newRoot->right; newRoot->right=root; } if(leftD<rightD) if(root->right->left!=NULL){ newRoot=root->right->left; root->right->left=newRoot->right; newRoot->right=balance(root->right); root->right=newRoot->left; newRoot->left=balance(root); } else{ newRoot=root->right; root->right=NULL; newRoot->left=root; } computeDepth(newRoot->left); computeDepth(newRoot->right); return newRoot; } TreeNode *insertBTree(TreeNode *root,int val){ TreeNode *newNode,*newRoot; if(root==NULL){ newNode=new TreeNode; newNode->val=val; newNode->depth=1; newNode->left=NULL; newNode->right=NULL; return newNode; } if(val<=root->val) root->left=insertBTree(root->left,val); else root->right=insertBTree(root->right,val); newRoot=balance(root); computeDepth(newRoot); return newRoot; } void save_delTree(TreeNode *root,FILE *fout){ char result[20]; sprintf(result,"%d\n",root->val); fputs(result,fout); if(root->left!=NULL) save_delTree(root->left,fout); else fputs(" $\n",fout); if(root->right!=NULL) save_delTree(root->right,fout); else fputs("$\n",fout); delete root; } int main() { FILE *fin,*fout; TreeNode *root; int val; char inFile[30],outFile[30]; printf("input the data file's name:\n"); scanf("%s",inFile); printf("input the file name for saving results:\n"); scanf("%s",outFile); root=NULL; fin=fopen(inFile,"r"); while(fscanf(fin,"%d",&val)!=EOF) root=insertBTree(root,val); fclose(fin); fout=fopen(outFile,"w"); save_delTree(root,fout); fclose(fout); return 0; }
相关文章推荐
- cuDNN: efficient Primitives for Deep Learning 论文阅读笔记
- [3D游戏开发]Early ZBuffer
- UI中 View、Label的方法
- 产生冠军
- KnockoutJS的使用及分析
- HDU 1233 首字母变大写
- LeetCode Everyday --226
- Linux系统调用及用户编程接口(API)
- 程序员必读的六本书
- SCOI2009生日蛋糕
- 在Activity的onCreate方法中显示PopupWindow导致异常的原因分析及解决方案
- 第一百一十六天 how can I 坚持
- Android(java)学习笔记134:Handler用法总结和秒表案例
- error: variably modified 'table' at file scope
- Xmanager4使用记录
- shell脚本:shell的基本元素-6 重定向与管道
- 要成为linux网站运维工程师必须要掌握的技能
- 要成为linux网站运维工程师必须要掌握的技能
- JavaScript学习笔记2:JavaScript基本概念
- VS2012安装VA之后菜单栏中没有VASSISTX