二叉树的递归套路
树形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; }