感觉前序和中序遍历这颗二叉树,但是不需要建树,直接对节点求和就可以了!

将满二叉树转换为求和树

http://www.nowcoder.com/questionTerminal/b31734e46ba644de85a9cf95bbd57a5f

#include<bits/stdc++.h>
using namespace std;

void createTree(const vector<int> &arr, int pleft, int pright, int vleft, int vright, vector<int> &ans);

int main(void) {
    vector<int> arr;
    int n, t;

    while(cin >> t) { arr.push_back(t); }
    n = arr.size()/2;
    vector<int> ans(n, 0);
    createTree(arr, 0, n-1, n, 2*n-1, ans);

    for(int i = 0; i < n; i++) {
        if(i == 0) cout << ans[i];
        else cout << " " << ans[i]; 
    }
    return 0;
}
void createTree(const vector<int> &arr, int pleft, int pright, int vleft, int vright, vector<int> &ans) {
    if(pleft >= pright || vleft >= vright) return;

    int leftNum = 0, sum = 0;
    // 累加目前的中序遍历中所有的元素和,根节点要排除。
    for(int i = vleft; i <= vright; i++) {
        sum += arr[i];
        // 排除根节点,并记录左子树的孩子节点个数
        if(arr[i] == arr[pleft]) {
            sum -= arr[i];
            leftNum = i - vleft;
        }
    }
    // 当前中序的节点求和赋值
    ans[vleft + leftNum - ans.size()] = sum;
    // 依次遍历左子树和右子树
    createTree(arr, pleft+1, pleft+leftNum, vleft, vleft+leftNum-1, ans);
    createTree(arr, pleft+leftNum+1, pright, vleft+leftNum+1, vright, ans);
}
全部评论
请问是否还有创建二叉树的解法?
点赞 回复 分享
发布于 2020-04-15 21:36

相关推荐

点赞 评论 收藏
分享
06-13 10:15
门头沟学院 Java
想去夏威夷的大西瓜在...:我也是27届,但是我现在研一下了啥项目都没有呀咋办,哎,简历不知道咋写
点赞 评论 收藏
分享
测试糕手手:社会第一课,随便吹牛逼,直接说四个月,别老实。老实人只会被欺负
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务