vim的备份和还原

tinyfisher 发表于 2012-09-01

vim是编辑神器,配置成IDE风格,用起来十分顺手,但是配置过程比较麻烦,前几天配置完了,重做系统还需要再配一遍吗,答案是否定的,如何还原vim环境呢?

我的实验环境:ubuntu10.04.2

step0:安装vim:sudo apt-get install vim

step1:备份文件:1.文件夹:/.vim 2.配置文件:/etc/vimrc

step2:sudo apt-get install exuberant-ctags

step3:复制刚才备份的文件到相应的目录下,并修改权限,简单暴力的777权限

ok,还原成功!

根据二叉树的先序和中序遍历还原二叉树

tinyfisher 发表于 2012-08-26
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int value;
	struct node *left;
	struct node *right;
}Node,*pNode;

/*
 *根据二叉树的先序遍历和中序遍历,还原二叉树
 *先序:1,2,4,7,3,5,6,8;中序:4,7,2,1,5,3,8,6
*/

pNode BuildTree(int pre[],int mid[],int len)
{
	if(len<=0)
	{
		return NULL;
	}
	pNode root=(pNode)malloc(sizeof(Node));
	root->value=pre[0];                    //先序的第一个节点一定是根节点
	int left_len=0;
	int right_len=0;
	int root_value=pre[0];
	int i=0;
	while(mid[i]!=root_value)              //获取左子树长度
	{
		i++;
		left_len++;
	}
	right_len=len-left_len-1;              //获取右子树长度
	//printf("left_len is %d\n",left_len);
	//printf("right_len is %d\n",right_len);
	root->left=BuildTree(pre+1,mid,left_len);     //递归还原左子树
	root->right=BuildTree(pre+1+left_len,mid+1+left_len,right_len);  //递归还原右子树
	return root;
}

获取二叉树叶子数、高度及左右子树交换

tinyfisher 发表于 2012-08-21

二叉树的一些操作具有天然的递归性,本文实现了获取二叉树的叶子总数、获取二叉树高度以及交换二叉树的左右子树,代码均已编译通过。

1.获取二叉树叶子总数:左子树叶子总数+右子树叶子总数

typedef struct BNode
{
    char value;  //类型假设为char
    struct BNode *left;
    struct BNode *right;

} Node,*pNode,**ppNode;
int GetLeafeNum(pNode root)
{
    if(root==NULL)  //空节点叶子数为0
    {
        return 0;
    }
    else if(root->left==NULL&&root->right==NULL)
    {
       return 1;
    }
    return GetLeafeNum(root->left)+GetLeafeNum(root->right);
}

2.交换左右子树

void swap_tree(pNode root)
{
    if(root==NULL)
        return;
    else
    {
        pNode temp=root->left;
        root->left=root->right;
        root->right=temp;
        swap_tree(root->left);
        swap_tree(root->right);
    }
}

获取二叉树高度:左右子树高度较大的+1

int GetHeight(pNode root)
{
    if(root==NULL)
    {
        return 0;
    }
    //max(left,right)+1; 左右子树最高高度+1
    return (GetHeight(root->left)>=GetHeight(root->right)?(GetHeight(root->left)+1):(GetHeight(root->right)+1));
}

二叉树创建和遍历

tinyfisher 发表于 2012-08-03

二叉树的概念、性质等就不多介绍了,这里用C语言实现了二叉树的建立(1.用户输入,2.给数组参数),前中后序遍历和按层遍历。

1.二叉树的建立

typedef struct BNode
{
    char value;  //类型假设为char
    struct BNode *left;
    struct BNode *right;

} Node,*pNode,**ppNode;

pNode CreateBTree()  //通过输入建立二叉树,'@'表示空节点,先序顺序,空节点必须输入
{
    char ch;
    pNode q;
    scanf(" %c",&ch);  //%c前面的空格 用来清空缓冲区
   // fflush(stdin);  //或者这样清空缓冲区
    if(ch=='@')
    {
        return NULL;
    }
    else
    {
        q=(pNode)malloc(sizeof(Node));
        if(q==NULL)
        {
            printf("malloc error\n");
            return NULL;
        }
        q->value=ch;
        q->left=CreateBTree();
        q->right=CreateBTree();
        return q;
    }

}

pNode CreateBTree_from_array(char a[],int index,int len) //根据数组创建二叉树双链表
{
	if(index>=len) //叶子节点
		return NULL;
	else
	{
	pNode root=(pNode)malloc(sizeof(Node));
	if(root==NULL)
	{
		printf("malloc error\n");
		return NULL;
	}
	root->value=a[index];
	root->left=CreateBTree_from_array(a,2*index+1,len);
	root->right=CreateBTree_from_array(a,2*index+2,len);
	return root;
	}
}

2.二叉树的前中后序遍历:

void preorder(pNode root)  //先序遍历
{
    if(root==NULL)
        return;
    else
    {
        printf("%c",root->value);
        preorder(root->left);
        preorder(root->right);
    }
}

void midorder(pNode root)  //中序遍历
{
    if(root==NULL)
        return;
    else
    {
        midorder(root->left);
        printf("%c",root->value);
        midorder(root->right);
    }
}

void postorder(pNode root)//后序遍历
{
    if(root==NULL)
        return;
    else
    {
        postorder(root->left);
        postorder(root->right);
        printf("%c",root->value);
    }
}

3.二叉树按层遍历

/*
    二叉树按层遍历,借助队列,构建一个队列专门用来储存二叉树节点指针,先把根节点入队,假设是A,对A元素进行访问,
    然后对A的左右孩子依次入队,假设B,C。A出队列,再是对B进行访问,同样将B的左右孩子入队列,B出对列······
    重复以上,直到队列为空。
*/
#define LEN 10
typedef struct queue  //队列,包含pNode数组,首尾index
{
    pNode data[LEN];
    int front;
    int rear;
}BTreeQueue,*pBTreeQueue;

void TransLevel(pNode root)
{
    pBTreeQueue pqueue=(pBTreeQueue)malloc(sizeof(BTreeQueue));
    pNode proot=root;
    pqueue->front=0;
    pqueue->rear=0;
    if(proot==NULL)
    {
        printf("tree is null");
        return;
    }
    else
    {
        printf("%c",proot->value);
        pqueue->data[pqueue->front]=proot;  //根节点入队;
        (pqueue->rear)++;
        while((pqueue->front)<(pqueue->rear))
        {
            proot=pqueue->data[pqueue->front];
            (pqueue->front)++;  //队列首元素出列,保存为proot
            if(proot->left!=NULL)
            {
                printf("%c",proot->left->value);
                pqueue->data[pqueue->rear]=proot->left; //左子节点入队
                (pqueue->rear)++;
            }
            if(proot->right!=NULL)
            {
                printf("%c",proot->right->value);
                pqueue->data[pqueue->rear]=proot->right; //右子节点入队
                (pqueue->rear)++;
            }
        }
    }
}