#include <stdio.h> #include <stdlib.h> struct BTreeNode { int val; int depth; BTreeNode *left,*right; }; void ComputeDepth(BTreeNode *root) { //计算左右子树的最大深度 int depth; if(root->left) depth = root->left->depth; else depth = 0; if(root->right && root->right->depth > depth) depth = root->right->depth; root->depth = depth + 1; return; } BTreeNode* Balance(BTreeNode *root) { int leftDepth,rightDepth; BTreeNode *node; if(root->left) leftDepth = root->left->depth; else leftDepth = 0; if(root->right) rightDepth = root->right->depth; else rightDepth = 0; if(abs(leftDepth - rightDepth) < 2) { //平衡 return root; } if(leftDepth > rightDepth) if(root->left->right) { node = root->left->right; root->left->right = node->left; node->left = Balance(root->left); root->left = node->right; node->right = Balance(root); } else { node = root->left; //断开A节点 root->left = NULL; node->right = root; } else if(root->right->left) { node = root->right->left; root->right->left = node->right; node->right = Balance(root->right); root->right = node->left; node->left = Balance(root); } else { node = root->right; root->right = NULL; node->left = root; } ComputeDepth(node->left); ComputeDepth(node->right); return node; } BTreeNode* InsertBTree(BTreeNode *root,int val) { BTreeNode *newNode,*newRoot; if(root == NULL) { newNode = (BTreeNode *)malloc(sizeof(BTreeNode)); 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 PrintfTree(BTreeNode *root,char level[]) { printf("%s%d/n",level,root->val); char child_level[81]; sprintf(child_level,"%s%s",level," "); if(root->left) PrintfTree(root->left,child_level); else printf("%s$/n",child_level); if(root->right) PrintfTree(root->right,child_level); else printf("%s$/n",child_level); return; } void SaveDeleteTree(BTreeNode* root,FILE *fout,char level[]) { char result[256],str[256]; sprintf(str,"%s%s",level," "); sprintf(result,"%s%d/n",str,root->val); fputs(result,fout); if(root->left) SaveDeleteTree(root->left,fout,str); else { sprintf(result,"%s$/n",str); fputs(result,fout); } if(root->right) SaveDeleteTree(root->right,fout,str); else { sprintf(result,"%s$/n",str); fputs(result,fout); } free(root); return; } void main() { FILE *fin,*fout; BTreeNode *root = NULL; fin = fopen("in.txt","r"); int val; while(fscanf(fin,"%d",&val) != EOF) root = InsertBTree(root,val); fclose(fin); char level[256] = ""; PrintfTree(root,level); fout = fopen("out.txt","w"); SaveDeleteTree(root,fout,level); fclose(fout); system("PAUSE"); return; }