二叉树的递归套路
树形dp问题(二叉树套路)
对于一个二叉树求一个答案,都可以使用这种套路
==================================================
对于以x为头的子树(前提:可以跟x的左子树、右子树要信息)
步骤:
1)以x为头的子树想要得到答案,列可能性(可以跟左右要答案的)
2)要什么信息可以得到答案
3)如果左、右子树要求一样,信息即要求,若不一样,信息即全集
4)信息都有了,写代码
例1判断是否为满二叉树
可能性:x为头的二叉树的节点数=2的层数次方-1,则为满二叉树;否则不是
信息:左子树的层数和节点数,右子树的层数和节点数----------->加工我自己的信息:层数=max(左,右)+1;节点数:左+右+1
codingclass Info:信息Info process:跟左子树和右子树分别要信息后,加工我自己的信息(在process里面一定要加NULL的判断,这个是递归的结束)主函数:根据题目要求进行调用
class Info //信息:层数和节点数
{
public:
Info(int height, int Nodes)
{
this->height = height;
this->Nodes = Nodes;
}
public:
int height;
int Nodes;
};
Info process(TreeNode* x) //加工自己的信息
{
if (x == NULL) //x是空的话就返回(0,0)
{
Info xinfo(0, 0);
return xinfo;
}
Info leftInfo = process(x->left); //跟左子树要信息
Info rightInfo = process(x->right); //跟右子树要信息
int nodes = leftInfo.Nodes + rightInfo.height + 1; //加工我自己的信息
//int height = leftInfo.height ? leftInfo.height > rightInfo.height:rightInfo.height;
int height = max(leftInfo.height, rightInfo.height);
Info xinfo(nodes, height);
return xinfo;
}
bool isFull(TreeNode* Head) //主函数
{
Info info = process(Head);
int N = info.Nodes;
int H = info.height;
if (N == (2 ^ H - 1))
return true;
else return false;
}