1.二叉树
1.1 我们现在需求将一个数组转换成一棵树,即给定一个数组,我们需要将其按照完全二叉树的规则进行连接,将其转换成一颗二叉树
- 1.首先将数组地址以及数组的长度传给函数,我们申请一块用来存放数组长度个结构体的空间来存放;
BinaryTree* ArrToTree(int arr[], int len)
{
int i;
if(arr == NULL || len <= 0)return NULL;
BinaryTree* p_tree = NULL;
p_tree = (BinaryTree*)malloc(sizeof(BinaryTree)*len);
for(i=0; i<len; i++)
{
p_tree[i].n_value = arr[i];
p_tree[i].p_left = NULL;
p_tree[i].p_right = NULL;
}
for(i=0; i<len/2; i++)
{
if(2*i+1 <= len-1)
p_tree[i].p_left = &p_tree[2*i+1];
if(2*i+2 <= len-1)
p_tree[i].p_right = &p_tree[2*i+2];
}
return p_tree;
}
1.2 在 vim 中从另一个文件中向另一个文件中赋值代码
- 1.水平打开两个文件,在命令模式下输入 :sp 文件相对路径;
- 2.按 ctrl+w w 即可切换光标在文件的位置;
- 3.垂直打开两个文件,在命令模式下输入 :vsp 文件相对路径
- 4.ctrl+w q 以及 ctrl+w c 都是该模式下的退出方式;
- 5.vim -On 文件名 文件名 … :将这n个文件进行垂直分屏;
- 6.vim -on 文件名 文件名 … :将这n个文件进行水平分屏;
1.3 不用递归写前序遍历(因为递归也是需要占用内存的)
typedef struct tree
{
int n_value;
struct tree* p_left;
struct tree* p_right;
}BinaryTree;
typedef struct node
{
BinaryTree* n_value;
struct node* p_next;
}Node;
typedef struct stack
{
Node* p_top;
int n_count;
}Stack;
void s_Init(Stack** pp_stack)
{
*pp_stack = (Stack*)malloc(sizeof(Stack));
(*pp_stack)->n_count = 0;
(*pp_stack)->p_top = NULL;
}
void s_Push(Stack* p_stack, BinaryTree* num)
{
if(p_stack == NULL)
{
return;
}
Node* p_temp = NULL;
p_temp = (Node*)malloc(sizeof(Node));
p_temp->n_value = num;
p_temp->p_next = p_stack->p_top;
p_stack->p_top = p_temp;
p_stack->n_count++;
}
BinaryTree* s_Pop(Stack* p_stack)
{
BinaryTree* return_num = NULL;
if(p_stack == NULL)return -1;
Node* p_del = NULL;
p_del = p_stack->p_top;
return_num = p_del->n_value;
p_stack->p_top = p_stack->p_top->p_next;
free(p_del);
p_del = 0;
p_stack->n_count--;
return return_num;
}
void UnRecPreorderTraversal(BinaryTree* p_tree)
{
if(p_tree == NULL)return;
Stack* p_stack = NULL;
s_Init(&p_stack);
while(1)
{
while(p_tree)
{
printf("%d ", p_tree->n_value);
s_Push(p_stack, p_tree);
p_tree = p_tree->p_left;
}
p_tree = s_Pop(p_stack);
if(p_tree == NULL)return;
p_tree = p_tree->p_right;
}
}