Linux与数据结构 2019-3-16下午

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;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42896619/article/details/88703847