sql字符串转换为数字求和
Problem statement: Given a Binary Tree where each node has positive and negative values. Convert this to a tree where each node contains the sum of the left and right sub trees in the original tree. The values of leaf nodes are changed to 0.
问题陈述:给定二叉树,其中每个节点都有正值和负值。 将其转换为树,其中每个节点都包含原始树中左右子树的总和。 叶子节点的值更改为0。
Example:
例:
For example, the following tree
10
/ \
-2 8
/ \ / \
6 -5 -7 5
Should be converted to:
5(1-2-2+8)
/ \
1(6-5) -2(-7+5)
/ \ / \
0 0 0 0
Sum tree
求和树
A binary tree is said to be converted in sum tree:
据说二叉树将在求和树中转换:
All leaf nodes are converted to 0
所有叶节点都转换为0
All nodes have the sum of right subtree & left subtree in the original tree
所有节点在原始树中都有右子树和左子树的总和
Let’s consider,
考虑一下
For any intermediate node having two child at kth level
对于第 k级有两个子级的任何中间节点
Value of the node must be updated as
节点的值必须更新为
Sum of right subtree of the node+ sum of left subtree of the node
节点的右子树之和+节点的左子树之和
Now consider both the right & left child has been already converted to their update node values having respective subtree sums up to (k+1)th level (from bottom to (k+1)th level).
现在考虑两个右和左子已被转换为具有相应的子树求和它们的更新节点值高达至(k + 1) 个电平(从底部到第(k + 1) 个电平)。
So the node value should be updated as: right child value + left child value + subtree sums up to (k+1)th level
因此节点的值应该被更新:右孩子的值+左子值+子树归纳至(k + 1) 个水平
=old right child value + old left child value + new left child value (sum of subtrees up to (k+1)th level) + new right child value (sum of subtrees up to (k+1)th level).
=旧右孩子值+旧左子值+新左子值(子树的总和最多至(k + 1) 个电平)+新右孩子值(子树的总和最多至(k + 1) 个电平)。
So, here we can develop our recursive function to develop the algo
因此,在这里我们可以开发递归函数来开发算法
FUNCTION toSumTree (node)
1. Check base case
IF (node==NULL)
Return 0;
2. Store old value of node
3. Update node value to left subtree sum + right
subtree sum. Use recursion to find subtree sums
4. Return old node value + current node value for
upper levels ( towards root)
END FUNCTION
转换为求和树的C ++实现 (C++ implementation for Transform to Sum Tree)
#include <bits/stdc++.h>
using namespace std;
// tree node is defined
class tree{
public:
int data;
tree *left;
tree *right;
};
//convert to sum tree
int toSumTree(tree *node){
if(!node) //base case
return 0;
//store old value
int temp=node->data;
//update to new value
node->data=toSumTree(node->left)+toSumTree(node->right);
//return for upper level sums
return node->data+temp;
}
//printing the tree using level order traversal
void printTree(tree* root){
queue<tree*> q; // using stl
tree* temp;
q.push(root);
q.push(NULL);
cout<<"root\n";
while(!q.empty()){
temp=q.front();
q.pop();
if(temp==NULL){
if(!q.empty()){
cout<<"\nnext level\n";
q.push(NULL);
}
}
else{
cout<<temp->data<<" "; //print node
if(temp->left)
q.push(temp->left); //EnQueue
if(temp->right)
q.push(temp->right); //EnQueue
}
}
}
// creating new node
tree* newnode(int data)
{
tree* node = (tree*)malloc(sizeof(tree));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
int main()
{
//**same tree is builted as shown in example**
cout<<"same tree is built as shown in example\n";
tree *root=newnode(10);
root->left= newnode(-2);
root->right= newnode(8);
root->right->right=newnode(5);
root->right->left=newnode(-7);
root->left->left=newnode(6);
root->left->right=newnode(-5);
cout<<"printing the original tree...\n";
printTree(root);
toSumTree(root);
cout<<"\nprinting the converted tree...\n";
printTree(root);
return 0;
}
Output
输出量
same tree is built as shown in example
printing the original tree...
root
10
next level
-2 8
next level
6 -5 -7 5
printing the converted tree...
root
5
next level
1 -2
next level
0 0 0 0
Explanation with example:
举例说明:
Let’s see how the function solves the above example.
让我们看看该函数如何解决上述示例。
Original tree:
10
/ \
-2 8
/ \ / \
6 -5 -7 5
In the main function it calls toSumTree (10)
------------------------------------------------------------
toSumTree (10) //call at Main()
node is not NULL
temp=10
new node value = toSumTree (10->left) + toSumTree (10->right)
=toSumTree (-2) + toSumTree (8)
Thus call to toSumTree (-2) and toSumTree (8)
Return new node value + temp (10)
------------------------------------------------------------
toSumTree (-2) //call at toSumTree (10)
node is not NULL
temp=-2
new node value = toSumTree (-2->left) + toSumTree (-2->right)
=toSumTree (6) + toSumTree (-5)
Thus call to toSumTree (6) and toSumTree (-5)
Return new node value + temp (-2)
------------------------------------------------------------
toSumTree (8) //call at toSumTree (10)
node is not NULL
temp=8
new node value = toSumTree (8->left) + toSumTree (8->right)
=toSumTree (-7) + toSumTree (5)
Thus call to toSumTree (-7) and toSumTree (5)
Return new node value + temp (8)
------------------------------------------------------------
toSumTree (6) //call at toSumTree (-2)
node is not NULL
temp=6
new node value = toSumTree (6->left) + toSumTree (6->right)
=toSumTree (NULL) + toSumTree (NULL)
Thus call to toSumTree (NULL) and toSumTree (NULL)
Return new node value + temp (6)
------------------------------------------------------------
toSumTree (-5) //call at toSumTree (-2)
node is not NULL
temp=-5
new node value = toSumTree (-5->left) + toSumTree (-5->right)
=toSumTree (NULL) + toSumTree (NULL)
Thus call to toSumTree (NULL) and toSumTree (NULL)
Return new node value + temp (-5)
------------------------------------------------------------
toSumTree (-7)//call at toSumTree(8)
node is not NULL
temp=-7
new node value = toSumTree (-7->left) + toSumTree (-7->right)
=toSumTree (NULL) + toSumTree (NULL)
Thus call to toSumTree (NULL) and toSumTree (NULL)
Return new node value + temp (-7)
------------------------------------------------------------
toSumTree (5)//call at toSumTree (8)
node is not NULL
temp=5
new node value = toSumTree (5->left) + toSumTree (5->right)
=toSumTree (NULL) + toSumTree (NULL)
Thus call to toSumTree (NULL) and toSumTree (NULL)
Return new node value + temp (5)
------------------------------------------------------------
toSumTree (NULL)//call at toSumTree(6)
node is NULL
return 0
------------------------------------------------------------
toSumTree (NULL)//call at toSumTree (6)
node is NULL
return 0
------------------------------------------------------------
toSumTree (NULL)//call at toSumTree(-5)
node is NULL
return 0
------------------------------------------------------------
toSumTree (NULL)//call at toSumTree(-5)
node is NULL
return 0
------------------------------------------------------------
toSumTree (NULL)//call at toSumTree(-7)
node is NULL
return 0
------------------------------------------------------------
toSumTree (NULL)//call at toSumTree(-7)
node is NULL
return 0
------------------------------------------------------------
toSumTree (NULL)//call at toSumTree(5)
node is NULL
return 0
------------------------------------------------------------
toSumTree (NULL)//call at toSumTree(5)
node is NULL
return 0
At toSumTree (6) //call at toSumTree(-2)
new node value = toSumTree (6->left) + toSumTree (6->right)
=toSumTree (NULL) + toSumTree (NULL)
=0
6->0
It returns 0+6=6
------------------------------------------------------------
At toSumTree (-5) //call at toSumTree(-2)
new node value = toSumTree (-5->left) + toSumTree (-5->right)
=toSumTree (NULL) + toSumTree (NULL)
=0
-5->0
It returns 0-5=-5
------------------------------------------------------------
At toSumTree (-7) //call at toSumTree(8)
new node value = toSumTree (-7->left) + toSumTree (-7->right)
=toSumTree (NULL) + toSumTree (NULL)
=0
-7->0
It returns 0-7=-7
------------------------------------------------------------
At toSumTree (5) //call at toSumTree (8)
new node value = toSumTree (5->left) + toSumTree (5->right)
=toSumTree (NULL) + toSumTree (NULL)
=0
5->0
It returns 0+5=5
------------------------------------------------------------
At toSumTree (-2) //call at toSumTree(10)
new node value = toSumTree (-2->left) + toSumTree (-2->right)
=toSumTree (6) + toSumTree (-5)
=6 + (-5) =1
-2->1
It returns -2+1=-1
------------------------------------------------------------
At toSumTree (8) //call at toSumTree (10)
new node value = toSumTree (-8->left) + toSumTree (-8->right)
=toSumTree (-7) + toSumTree (5)
=-7 + (5) =-2
8->-2
It returns -2+8=6
------------------------------------------------------------
At toSumTree (10) //call at main
new node value = toSumTree (10->left) + toSumTree (10->right)
=toSumTree (-2) + toSumTree (8)
=-1 + 6=5
10->5
It returns 10+5=15
So, the binary tree is sum converted to:
5
/ \
1 -2
/ \ / \
0 0 0 0
翻译自: https://www.includehelp.com/icp/transform-to-sum-tree.aspx
sql字符串转换为数字求和