算是对C语言的一次总结复习了,在参考一篇二叉树的文章后,自己实现了二叉树的一系列操作。时间有点晚了,就贴上参考文章和代码吧,感觉这里递归思想用的很多,我全部用递归写的。
http://cslibrary.stanford.edu/110/BinaryTrees.html
#define NULL 0
#include <stdlib.h>
struct node{
int data;
struct node *left;
struct node *right;
};
typedef struct node BTree;
int max2(int a,int b);
BTree * insert(BTree *root,int data){
if(root==NULL){
root=(BTree *)malloc(sizeof(BTree));
root->data=data;root->left=NULL;root->right=NULL;
}else{
if(data<=root->data)root->left=insert(root->left,data);
else root->right=insert(root->right,data);
}
return root;
}
BTree * buildTree(int data[],int size){
int i=0;
BTree *root=NULL;
for(i=0;i<size;i++){
root=insert(root,data[i]);
}
return root;
}
int lookup(BTree *root,int target){
if(root==NULL){
return 0;
}else{
if(target==root->data)return 1;
else{
if(target<root->data)return lookup(root->left,target);
else return lookup(root->right,target);
}
}
}
int size(BTree *root){
if(root==NULL)return 0;
else{
return 1+size(root->left)+size(root->right);
}
}
int maxDepth(BTree *root){
if(root==NULL)return 0;
else{
return 1+max2(maxDepth(root->left),maxDepth(root->right));
}
}
int max2(int a,int b){
return a>b?a:b;
}
int minValue(BTree *root){
if(root==NULL)return;
while(root->left!=NULL)root=root->left;
return root->data;
}
void printTree(BTree *root){
if(root==NULL)return;
else{
printTree(root->left);
printf("%d",root->data);
printTree(root->right);
}
}
int hasPathSum(BTree *root,int sum){
if(root==NULL){
if(sum==0)return 1;
else return 0;
}else{
return (hasPathSum(root->left,sum-root->data)||hasPathSum(root->right,sum-root->data));
}
}
void printPaths(BTree *root){
if(root==NULL)return;
else{
if(root->left!=NULL){
printf("%d ",root->data);
printPaths(root->left);
}
if(root->right!=NULL){
printf("%d ",root->data);
printPaths(root->right);
}
if(root->left==NULL&&root->right==NULL){
printf("%d/n",root->data);
}
}
}
void mirror(BTree *root){
BTree *temp;
if(root==NULL)return;
else{
temp=root->left;
root->left=root->right;
root->right=temp;
mirror(root->left);
mirror(root->right);
}
}
void doubleTree(BTree *root){
BTree *new;
if(root==NULL)return;
else{
new=(BTree *)malloc(sizeof(BTree));
new->data=root->data;new->left=NULL;new->right=NULL;
new->left=root->left;
root->left=new;
doubleTree(new->left);
doubleTree(root->right);
}
}
int sameTree(BTree *a,BTree *b){
if(a==NULL&&b==NULL)return 1;
else if(a!=NULL&&b!=NULL&&a->data==b->data)
return (sameTree(a->left,b->left)&&sameTree(a->right,b->right));
else return 0;
}
int isBST(BTree *root,int min,int max){
if(root==NULL)return;
else{
if(root->data<=max&&root->data>min)
return isBST(root->left,min,root->data)&&isBST(root->right,root->data,max);
else return 0;
}
}
main(){
int data[]={2,1,3,4};
BTree *root=buildTree(data,4);
BTree *root2=buildTree(data,4);
printf("%d/n",root->right->right->data);
printf("%d/n",hasPathSum(root,3));
doubleTree(root);
doubleTree(root2);
printf("%d/n",isBST(root,0,5));
}