Maximum Binary Tree - 最大二叉树


问题

拥有个节点的二叉树,节点范围为,节点的权值为正整数,整个二叉树的权值为所有节点的权值之和。现在要求只保留个节点(),剪裁掉的节点数量为,要求剩余部分仍然是一个二叉树,而不能是多个二叉树。如图:

正确剪裁

MaxBinaryTree1.png

MaxBinaryTree2.png

错误剪裁

MaxBinaryTree3.png

对于拥有个节点的二叉树,求出保留个节点的二叉树的最大权值。

解法

表示以节点为根节点的树上,保留个节点(包括节点自己)的最大权值。因此有转移方程如:

节点数量为的二叉树,其最大权值即为节点自己的权值,因此

对于根节点为的二叉树,只留个节点。当左子树上有个节点(),则右子树上有个节点,因为左右子树的节点数量之和为(根节点占一个节点)。设其左右孩子节点为,左子树的最大权值为,右子树的最大权值为,根节点的子树的最大权值为。遍历,在所有可能中选取使最大的即可;

即为该二叉树留下个节点时的最大权值。该算法的时间复杂度是


源码

MaximumBinaryTree.h

MaximumBinaryTree.cpp

测试

MaximumBinaryTreeTest.cpp