作业:
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、实现之字形打印一棵二叉树,第一行从左到右,第二行从右到左,第三行又从左到右打印,依此类推
选择树:(胜者树、败者树)
是一种完全二叉树,把要比较选择的数据存储在树的最底下一层,根节点是左右子树中选择一个,是它们中最大的或者最小的,选择树的功能是能够快速地找出树中的最大值或者最小值
堆:
是一种完全二叉树,而且不适合采用链式存储,因为要频繁地与父节点比较。
大根堆(大顶堆):根节点左右子树大
小根堆(小顶堆):根节点左右子树小
顺序结构数据项:
存储数据的内存首地址
容量
数量
操作:
创建、添加、删除、空堆、满堆、堆顶
堆的应用:
适合实现优先队列