计算二叉搜索树的累加树,自定义“右子节点——根节点——左子节点“的遍历顺序

力扣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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值