数据结构一些自己没搞懂的点

说来惭愧,2018年9月PAT甲级最后一题就是建树然后LCA 自己那个时候LCA不知道怎么写。。。。已经过了一年了

现在也不会写哈哈哈哈

目前考研 树的那块要学  默默的掏出我的小电脑开始学呜呜呜 这个故事告诉我们不要瞎偷懒 出来混迟早都是要还的

递归代码:

//结构体 
struct node
{
	int val;
	node *left;
	node *right;
};
//查找最近公共祖先 
node *LCA(node *root, int u, int v) {   
        if (root == NULL) 
			return NULL; //树为空 返回NULL当然没有公共祖先 
        if (root->val == u || root->val == v) 
			return root; 
		/*
		 *其中一个数就是root->data 那么直接返回root 另外一个数有两种情况 
		 *1.在后代中 那么一定就是root 
		 *2.不在该树中 那么root中只有一个数 返回root 
		 */
        node *left = LCA(root->left, u, v);
        node *right = LCA(root->right, u, v);
        if (left && right ) 
		return root;  //u v分别位于左右子树的情况都找到了 
	if(left) 
		return left;  //u v 分布在左侧 
	if(right)
		return right; //u v 分布在右侧 
	return NULL; 
}

 

对于一个满二叉树 调换他的先序和后序

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void PreToPost(int pre[], int prl, int prr,int post[], int pol, int por)
{
	if(prr < prl || por < pol)
		return ;
	post[por] = pre[prl]; 
	int half = (prr - prl) / 2;
	PreToPost(pre, prl + 1, prl + half, post, pol, pol + half - 1);
	PreToPost(pre, prl + half + 1, prr, post, pol + half, por - 1);
	return ;
} 
using namespace std;
int main()
{
	int pre[10] = {0,1,2,3,4,5,6,7,8,9};
	int post[10];
	PreToPost(pre, 1, 7, post, 1, 7);
	for(int i = 1; i <= 7; i ++)
		printf("%d%c",post[i]," \n"[i==7]);
	return 0;
}

 

将叶子节点的连接起来

LinkedList head = NULL ,pre = NULL;
LinkedList Inorder(BiTree bt)
{
	if(bt)
	{
		Inorder(bt->left);
		if(bt->left == NULL && bt->right == NULL)
		{
			if(head == NULL)
			{
				head = bt;
				pre = bt;
			}else 
			{
				pre->right = bt;
				pre = bt;
			}	
		}
		Inorder(bt->right);
		pre->right = NULL;
	}
	return head;
}

判断两个子树是否相同

bool is_Same(Bitree a, Bitree b)
{
	if(a == NULL && b == NULL)
		return true;
	if(a == NULL && b != NULL || a != NULL && b == NULL )
		return false;
	if(is_Same(a->left,b->left) && is_Same(a->right, b->right))
		return true;
}

 

表达式树转换成中缀表示式

void Bitree(Bitree *root, int deep)
{
	if(root == NULL)
		return ;
	else if(root->left == NULL && root->right == NULL)	
		printf("%s",root->data);
	else 
	{
		if(deep > 1)
			printf("(");
		Bitree(root->left, deep + 1);
		printf("%s",root->data);
		Bitree(root->right, deep + 1);
		if(deep > 1)
			printf(")");
	}
}

表达式的分支对应子表达式的计算次数 有该分支节点所处的位置决定

为了得到正确的中缀表达式 需要在生成遍历树的同时  在适当位置添加必要的括号 显然 表达式最外层 对应根节点  和操作数不需要添加括号

 

本质上是那些运算符添加符号   这边自己似乎以前就一直没好好搞懂

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值