把二叉搜索树变成一个二叉树,使得原来每个节点的值 变成 (原来的值+所有大于它的值的和)
来源:互联网 发布:java微信商城 编辑:程序博客网 时间:2024/06/10 12:09
Given a Binary Search Tree (BST), convert it to a Binary Tree such that every key of the original BST is changed to key plus sum of all greater keys in BST.
Examples:
Input: Root of following BST
5
/ \
2 13
Output: The given BST is converted to following Binary Tree
18
/ \
20 13
使用递归的方法,递归函数定义为 convert(Node* root, int& sum),root是子树的根节点,sum是该子树所有节点的和。
方法一代码如下:
#include<stdio.h>#include<stdlib.h> struct Node{ int value; Node* lchild; Node* rchild; Node(int val, Node* lch, Node* rch):value(val), lchild(lch), rchild(rch) {} };void convert(Node* root, int& sum){if(root==NULL)return;convert(root->rchild, sum);root->value = sum + root->value;sum = root->value;convert(root->lchild, sum);}void print(Node* root){if(root){printf("%d|",root->value);print(root->lchild); print(root->rchild);}}int main(){ Node* n1 = new Node(1,NULL,NULL); Node* n3 = new Node(3,NULL,NULL); Node* n2 = new Node(2,n1,n3); Node* n5 = new Node(5,NULL,NULL); Node* n4 = new Node(4,n2,n5); /* Constructed binary tree is 4 / \ 2 5 / \ 1 3 */ int sum = 0; convert(n4, sum);// convert(n4, 15) is wrong, since a temporary object cannot be assigned to a non-const referenceprint(n4);getchar();return 0;}
方法二也采用递归:
#include<stdio.h>#include<stdlib.h> struct Node{ int value; Node* lchild; Node* rchild; Node(int val, Node* lch, Node* rch):value(val), lchild(lch), rchild(rch) {} };void convert(Node* root, int& sum){if(root==NULL)return;if(root->lchild)convert(root->lchild, sum);int temp = root->value;root->value = sum;sum = sum - temp;convert(root->rchild, sum);}void print(Node* root){if(root){printf("%d|",root->value);print(root->lchild); print(root->rchild);}}int main(){ Node* n1 = new Node(1,NULL,NULL); Node* n3 = new Node(3,NULL,NULL); Node* n2 = new Node(2,n1,n3); Node* n5 = new Node(5,NULL,NULL); Node* n4 = new Node(4,n2,n5); /* Constructed binary tree is 4 / \ 2 5 / \ 1 3 */ int sum = 15; convert(n4, sum);// convert(n4, 15) is wrong, since a temporary object cannot be assigned to a non-const referenceprint(n4);getchar();return 0;}
- 把二叉搜索树变成一个二叉树,使得原来每个节点的值 变成 (原来的值+所有大于它的值的和)
- 给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?
- 给定一个链表和一个值x,对它进行分区,使得小于x的所有节点都在大于或等于x的节点之前.保留两个分区中的每一个节点的原始相对顺序。
- 二叉树的每个节点
- lower_bound和upper_bound,原来都是求刚好大于的值
- 给定一个二叉树,节点值为0-9,从根节点到叶子结点组成一个数,求二叉树所有组成的数的和
- 【微软面试题】在二叉搜索树中找最小的大于某个key值的节点
- 打印二叉树中一个节点的所有祖先节点
- 查看一颗二叉树的每个节点的值是否都是其左右两个孩子节点值的和
- 把一个二叉树转成它的“镜像”
- 给定一棵二叉树,二叉树每个节点的值唯一,从根节点开始找出路径上的所有节点的节点值之和等于规定值的路径
- 二叉查找树面试题——计算每个节点的比其值大的节点和
- 二叉树的每个节点为0-9的一个数字,根到叶子的一条路径拼成一个数,求所有路径形成的数字和
- 输入一个满二叉树的深度和它的三个节点,求三个节点最小子树的,根节点
- 输入一个满二叉树的深度和它的三个节点,求三个节点最小子树的,根节点
- 有一个二叉树, 节点全部为整数,如何找到一个子树,它所有节点的和最大?要求编程序实现。
- 恢复被交换二叉搜索树的节点值
- 二叉树变成搜索二叉树
- Shell 语法
- PROTEL99SE自动弹出WARNING
- JSP的I18N标签
- 双网卡绑定
- Android 【SDK目录结构】、【源码sources目录结构】及【如何在eclipse中查看源码】
- 把二叉搜索树变成一个二叉树,使得原来每个节点的值 变成 (原来的值+所有大于它的值的和)
- linux下的C
- 大考:城市化
- Transform - Functions
- POJ 1581
- HDU 1076 An Easy Task
- 新鲜出炉:基于HTML5的jquery文件上传插件(多文件选择、带进度条、完整可用)
- cocos2d-x 自建动画管理器AnimationManager的方法和使用
- ARM Linux中断机制分析