数据结构与算法 学习笔记 2021年12月22日

作业:
        1、把一棵二叉树转换成它的镜像树

struct TreeNode* Mirror(struct TreeNode* pRoot ) {
    // write code here
    if(pRoot) //判断边界条件,是否为空树 空树递归结束
    {
        struct TreeNode* temp;//定义一个缓冲指针
        temp=Mirror(pRoot->left);//缓冲并镜像左树
        pRoot->left=Mirror(pRoot->right);//左树等于右树
        pRoot->right=temp;//右树等于左树(缓冲)
    }
    return pRoot;
}

        2、输入两棵二叉树A、B,判断B是不是A的子结构(空树不是任意一棵树的子结构)

bool IsSame(struct TreeNode* pRoot1, struct TreeNode* pRoot2)//递归判断是否是子结构
{
    bool left=true,right=true;
    if(!pRoot1||pRoot1->val!=pRoot2->val)
        return false;
    if(pRoot2->left)
        left=IsSame(pRoot1->left, pRoot2->left);
    if(pRoot2->right)
        right=IsSame(pRoot1->right, pRoot2->right);
    return left&&right;
}
bool HasSubtree(struct TreeNode* pRoot1, struct TreeNode* pRoot2)
{
    if(!pRoot2||!pRoot1)    return false;
    if(IsSame(pRoot1, pRoot2))    return true;
    if(HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2))
        return true;
    else
        return false;
}

        3、把一棵有序二叉树转换为一个有序的双向链表

static struct TreeNode* prev = NULL;
struct TreeNode* Convert(struct TreeNode* pRootOfTree ) {
    // write code here
    if (pRootOfTree == NULL)
		return NULL;

	struct TreeNode* head = Convert(pRootOfTree->left);
	if (head == NULL)
		head = pRootOfTree;

	pRootOfTree->left = prev;
	if (prev != NULL)
		prev->right = pRootOfTree;
	prev = pRootOfTree;

	Convert(pRootOfTree->right);

	return head;
}

        4、计算出有序二叉树中倒数第k大的值
        5、判断一棵树是否对称

bool subroot(struct TreeNode* left,struct TreeNode* right){
    if(left == NULL) return right == NULL;
    if(right == NULL) return false;
    if(left->val != right->val) return false;
    return subroot(left->right,right->left) && subroot(left->left,right->right);
}

bool isSymmetrical(struct TreeNode* pRoot ) {
    // write code here
    if(pRoot == NULL)    return true;
    return subroot(pRoot->left,pRoot->right);
}

        6、实现之字形打印一棵二叉树,第一行从左到右,第二行从右到左,第三行又从左到右打印,依此类推


选择树:(胜者树、败者树)
        是一种完全二叉树,把要比较选择的数据存储在树的最底下一层,根节点是左右子树中选择一个,是它们中最大的或者最小的,选择树的功能是能够快速地找出树中的最大值或者最小值
堆:
        是一种完全二叉树,而且不适合采用链式存储,因为要频繁地与父节点比较。
        大根堆(大顶堆):根节点左右子树大
        小根堆(小顶堆):根节点左右子树小
        顺序结构数据项:
                存储数据的内存首地址
                容量
                数量
        操作:
                创建、添加、删除、空堆、满堆、堆顶
        堆的应用:
                适合实现优先队列
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值