IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 1022. 从根到叶的二进制数之和(附带详细讲解和实例) -> 正文阅读

[数据结构与算法]1022. 从根到叶的二进制数之和(附带详细讲解和实例)

1 题目

在这里插入图片描述

2 思路

题目的大意就是求树根节点到叶子结点的路径,然后根据路径上的权值求出每条路径的值,最后累加得到所有路径的值。

求路径,使用先序遍历,每次记录遍历到的每层节点,当该节点的左右孩子均为空时,该节点为叶子节点,计算路径值。

3 代码

  • 1,depth方法中,每次value值,都逐层累加计算路径值。
  • 2,depth2方法2中,每次记录路径值,当遇到叶节点时,计算路径值。
class Solution {
public:
    int res = 0;
    void depth(TreeNode* root, int value){
        if(root != nullptr){
            value = (value<<1) + root->val;//结点值每到下一层就进一位
//        cout<<value<<" ";
            if(root->left == nullptr && root->right == nullptr){
                res += value;
                return;
            }
            depth(root->left, value);
            depth(root->right, value);
        }
    }


    void depth2(TreeNode* root, vector<int> path,  int deep){
        if(root == nullptr) return;
        path[deep] = root->val;
        if(root->left == nullptr && root->right == nullptr){
            for(int d = 0;d <= deep;d++){
                res += path[d] * pow(2, deep - d);
            }

            //打印路径
//            for (int d = 0; d <= deep; d++)
//            {
//                if(d == 0) printf("%d", path[d]);
//                else printf("->%d", path[d]);
//            }
//            printf("\n");

            return;
        }
        depth2(root->left, path,  deep + 1);
        depth2(root->right, path, deep + 1);
    }


    int sumRootToLeaf(TreeNode* root) {
        //法1
        depth(root, 0);
        //法2
//        vector<int> path(100, 0);
//        depth2(root, path, 0);

        return res;
    }
};

4 测试用例

#include <iostream>

#include <vector>
#include <stack>
#include <cmath>
#include <deque>

using namespace std;

//树结构
struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

//层序遍历创树
void createBiTNode(TreeNode** treeNode, deque<int> dataDeq) {//层序遍历建立二叉树
    //空结点值
    int nullTreeNodeValue = -1;

    cout<<dataDeq.size()<<endl;
    for(size_t i = 1; ; i++){
        int fullBinaryTreeNum = pow(2, i) - 1;
        if(dataDeq.size() <= fullBinaryTreeNum){
            while(dataDeq.size() < fullBinaryTreeNum){
                dataDeq.push_back(nullTreeNodeValue);//添加空节点凑成一棵树
            }
            break;
        }
    }

//    for(auto i:dataDeq){
//        cout<<i<<" ";
//    }cout<<endl;

    //特殊处理根结点
    char data;
    data = dataDeq.front();
    dataDeq.pop_front();
    TreeNode * node = new TreeNode();
    *treeNode = node;
    (*treeNode)->val = data;

    deque<TreeNode**> nodeDeq;//用于层序建立树时访问双亲节点
    nodeDeq.push_back(treeNode);

    int index = 2;//用于判定左右孩子(左偶,右奇)
    while (!dataDeq.empty()){//当数据节点非空时,进行建树

        TreeNode** nodeParent = nodeDeq.front();
        nodeDeq.pop_front();

        for(int i = 0; i < 2;i++){
            data = dataDeq.front();
            dataDeq.pop_front();
            if(data == nullTreeNodeValue){
                if(index%2 == 0) (*nodeParent)->left = nullptr;
                else (*nodeParent)->right = nullptr;
            }else{
                TreeNode * node = new TreeNode();
                node->val = data;
                if(index%2 == 0){
                    (*nodeParent)->left = node;
                    nodeDeq.push_back(&(*nodeParent)->left);
                }else{
                    (*nodeParent)->right = node;
                    nodeDeq.push_back(&(*nodeParent)->right);
                }
            }
            index++;
        }
    }
}


class Solution {
public:
    int res = 0;
    void depth(TreeNode* root, int value){
        if(root != nullptr){
            value = (value<<1) + root->val;//结点值每到下一层就进一位
//        cout<<value<<" ";
            if(root->left == nullptr && root->right == nullptr){
                res += value;
                return;
            }
            depth(root->left, value);
            depth(root->right, value);
        }
    }


    void depth2(TreeNode* root, vector<int> path,  int deep){
        if(root == nullptr) return;
        path[deep] = root->val;
        if(root->left == nullptr && root->right == nullptr){
            for(int d = 0;d <= deep;d++){
                res += path[d] * pow(2, deep - d);
            }

            //打印路径
//            for (int d = 0; d <= deep; d++)
//            {
//                if(d == 0) printf("%d", path[d]);
//                else printf("->%d", path[d]);
//            }
//            printf("\n");

            return;
        }
        depth2(root->left, path,  deep + 1);
        depth2(root->right, path, deep + 1);
    }


    int sumRootToLeaf(TreeNode* root) {
        //法1
        depth(root, 0);
        //法2
//        vector<int> path(100, 0);
//        depth2(root, path, 0);

        return res;
    }
};


int main() {
    //deque<int> treeVec{1,1};
    
    TreeNode* tree = new TreeNode();
    createBiTNode(&tree, treeVec);
    Solution s;
    cout<<s.sumRootToLeaf(tree);

    return 0;
}



  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:47:47  更:2022-03-12 17:51:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:37:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码