URL
链接:https://leetcode.cn/problems/sum-of-root-to-leaf-binary-numbers/
题目
分析
源码
工程结构
.
├── main_1022.c
├── tree.c
└── tree.h
源码文件
/* main_1022.c */
#include <stdio.h>
#include "tree.h"
int dfs(struct tree_node *root , int val){
if (root == NULL){
return 0;
}
val = (val << 1) | root->val;
if (root->left == NULL && root->right == NULL ){
return val;
}
return dfs(root->left, val) + dfs(root->right, val);
}
int __sum(struct tree_node * root){
return dfs(root, 0);
}
int main()
{
/* input */
const int data[] = {1,0,0,NULL_NODE,NULL_NODE,1,NULL_NODE,NULL_NODE,1,0,NULL_NODE,NULL_NODE,1,NULL_NODE,NULL_NODE};
int size = sizeof(data)/sizeof(data[0]);
/* create tree */
RET ret = create_tree(data, size);
struct tree_node * root = ret.node;
display_tree(root);// print tree
/* sum */
int sum = __sum(root);
printf("sum = %d\n",sum);
return 0;
}
/* tree.c */
#include <stdio.h>
#include <stdlib.h>
#include "tree.h"
RET create_tree(const int * p, int size)
{
if (size == 0){
return (RET){NULL, 0};
}
if (p[0] == NULL_NODE){
return (RET){NULL, 1};
}
struct tree_node * node = (struct tree_node *)malloc(sizeof(struct tree_node));
node->val = p[0];
RET left = create_tree(p + 1, size - 1 );
RET right = create_tree(p + 1 + left.used, size - 1 - left.used );
node->left = left.node;
node->right = right.node;
return (RET){
node, 1 + left.used + right.used
};
}
void print_tree(struct tree_node * tree)
{
if (tree == NULL){
printf("null ");
return ;
}
printf("%d ", tree->val);
print_tree(tree->left );
print_tree(tree->right );
}
void display_tree(struct tree_node * root){
printf("tree: ");
print_tree(root);
printf("\n");
}
/* tree.h */
#ifndef __TREE_H__
#define __TREE_H__
#include <stdio.h>
#define NULL_NODE (-1)
typedef struct tree_node {
struct tree_node * left;
struct tree_node * right;
int val;
}TREE_NODE;
typedef struct {
struct tree_node * node;
int used;
}RET;
RET create_tree(const int * p, int size);
void display_tree(struct tree_node * tree);
#endif
LOG参考
tree: 1 0 0 null null 1 null null 1 0 null null 1 null null
sum = 22
源码概述
- dfs + 递归
小结
略