• 平衡二叉树


    //平衡二叉树
    #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
    ",root->val);
    	fputs(result,fout);
    	if(root->left!=NULL)
    		save_delTree(root->left,fout);
    	else
    		fputs(" $
    ",fout);
    	if(root->right!=NULL)
    		save_delTree(root->right,fout);
    	else
    		fputs("$
    ",fout);
    	delete root;
    }
    int main()
    {
    	FILE *fin,*fout;
    	TreeNode *root;
    	int val;
    	char inFile[30],outFile[30];
    	printf("input the data file's name:
    ");
    	scanf("%s",inFile);
    	printf("input the file name for saving results:
    ");
    	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;
    }

  • 相关阅读:
    实验12——java取整、猜数和猜拳
    实验11——java线程模拟卖票
    实验10—— java读取歌词文件内容动画输出
    实验09——java基于TCP实现客户端与服务端通信
    JavaSE第十四天
    javaSE第十一天
    JavaSE第十天
    JavaSE第十天
    JavaSE第九天
    JavaSE第八天
  • 原文地址:https://www.cnblogs.com/javafly/p/6037165.html
Copyright © 2020-2023  润新知