1022. 从根到叶的二进制数之和(计算所有根节点到叶结点的路径)————附带详细讲解和实例
发布时间:2023-02-15 18:09:32 245
相关标签: # ios# 数据
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<left == nullptr && root->right == nullptr){
res += value;
return;
}
depth(root->left, value);
depth(root->right, value);
}
}
void depth2(TreeNode* root, vector 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 path(100, 0);
// depth2(root, path, 0);
return res;
}
};
4 测试用例
测试输出:
//输出
1,0,1,0,1,0,1
//输出
1->0->0
1->0->1
1->1->0
1->1->1
22
//输入
1,1
//输出
1->1
3
测试代码:
#include
#include
#include
#include
#include
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 dataDeq) {//层序遍历建立二叉树
//空结点值
int nullTreeNodeValue = -1;
//cout<val = data;
deque 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<left == nullptr && root->right == nullptr){
res += value;
return;
}
depth(root->left, value);
depth(root->right, value);
}
}
void depth2(TreeNode* root, vector 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 path(100, 0);
// depth2(root, path, 0);
return res;
}
};
int main() {
deque treeVec{1,0,1,0,1,0,1};
// deque treeVec{1,1};
TreeNode* tree = new TreeNode();
createBiTNode(&tree, treeVec);
Solution s;
cout<
文章来源: https://blog.51cto.com/u_10941874/5786939
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报