力扣538题,BST转化累加树
但代码是没看答案自己写的:
#include<iostream>
class TreeNode{
public:
int val;
int nCount;
TreeNode *pl;
TreeNode *pr;
TreeNode(int val,TreeNode *pl,TreeNode *pr){
this->val=val;
this->nCount=0;
this->pl=pl;
this->pr=pr;
}
/*把二叉搜索树转换为累加树,虽然在现象上,当前节点的累加值等于
当前节点的父节点与右子节点的累加值的最大值加上当前节点的值,但这
不是本质,这只是现象,是先对当前节点的右子节点计算累加值然后再
计算当前节点的累加值的,整个二叉搜索树的累加值计算顺序应该是:
右子节点——>右子节点的父节点——>右子节点的左兄弟节点的最右子节点
这才是二叉树递归单元的本质规律
*/
void FillCount(TreeNode *pRoot,int &TotalCount){
if(pRoot==nullptr)return;
FillCount(pRoot->pr,TotalCount); //右子节点,右子节点的左兄弟节点的右子节点
//右子节点会计算出右子节点树的累加值并带出为TotalCount
pRoot->nCount=pRoot->val+TotalCount; //当前节点的累加值=当前节点值+右子节点树累加值
TotalCount=pRoot->nCount; //当前累加值=当前节点值+右子节点树的累加值
std::cout<<TotalCount<<"\n"; //输出计算过程的累加值
FillCount(pRoot->pl,TotalCount); //右子节点的左兄弟节点
}
};
int main(int argc,char *argv[]){
TreeNode *p8=new TreeNode(8,nullptr,nullptr);
TreeNode *p7=new TreeNode(7,nullptr,p8);
TreeNode *p5=new TreeNode(5,nullptr,nullptr);
TreeNode *p6=new TreeNode(6,p5,p7);
TreeNode *p3=new TreeNode(3,nullptr,nullptr);
TreeNode *p2=new TreeNode(2,nullptr,p3);
TreeNode *p0=new TreeNode(0,nullptr,nullptr);
TreeNode *p1=new TreeNode(1,p0,p2);
TreeNode *p4=new TreeNode(4,p1,p6);
int nTotalCount=0;
p4->FillCount(p4,nTotalCount);
}