BST หรือแผนผังการค้นหาแบบไบนารีคือรูปแบบของทรีไบนารีที่มีโหนดด้านซ้ายทั้งหมดเล็กกว่าและโหนดด้านขวาทั้งหมดมากกว่าค่ารูท สำหรับปัญหานี้ เราจะนำไบนารีทรีและเพิ่มค่าทั้งหมดที่มากกว่าโหนดปัจจุบันเข้าไป ปัญหา “เพิ่มค่าที่มากกว่าทั้งหมดให้กับทุกโหนดใน BST” นั้นง่ายขึ้น สำหรับ BST จะเพิ่มค่าโหนดทั้งหมดที่มากกว่าค่าโหนดปัจจุบันให้กับค่าโหนดนั้น
เพิ่มค่าที่มากกว่าทั้งหมดให้กับแต่ละโหนดในคำชี้แจงปัญหา BST:
จาก Binary Search Tree (BST) เราจำเป็นต้องเพิ่มไปยังแต่ละโหนด ซึ่งเป็นผลรวมของโหนดที่มีค่ามากกว่าทั้งหมด
อินพุต
10 / \ / \ 5 20 / \ / \ 1 7 1 5
ผลลัพธ์
70 / \ 82 45 / \ / \ 83 77 60 25
คำอธิบาย
โปรแกรมนี้จะแปลง BST เป็น Binary Tree โดยมีค่าของ nodes เป็นผลรวมขององค์ประกอบที่มากกว่าทั้งหมดบวกกับค่าดั้งเดิมของโหนด
เพิ่มค่าที่มากกว่าทั้งหมดให้กับแต่ละโหนดในโซลูชัน Binary Search Tree:
เราใช้ Reverse Inorder Traversal (เรียกซ้ำบนทรีย่อยด้านขวาก่อน แทนที่จะเป็นทรีย่อยด้านซ้าย) และรักษาตัวแปรเพื่อเก็บผลรวมของโหนดที่ข้ามผ่านมาแล้ว
จากนั้นเราใช้ผลรวมนี้เพื่อแก้ไขค่าของโหนดปัจจุบัน โดยเพิ่มมูลค่าลงในผลรวมก่อน จากนั้นจึงแทนที่ค่าของโหนดด้วยผลรวมนี้
ตัวอย่าง
#include <iostream >
using namespace std;
struct node {
int data;
node *left;
node *right;
};
node *newNode(int key) {
node *temp=new node;
temp->left=NULL;
temp->right=NULL;
temp->data=key;
return temp;
}
void Inorder(node *root) {
if(!root)
return;
Inorder(root->left);
cout<<root->data<<" ";
Inorder(root->right);
}
node *Insert(node *root,int key) {
if(!root)
return newNode(key);
if(key<root->data)
root->left=Insert(root->left,key);
else
root->right=Insert(root->right,key);
return root;
}
void RevInorderAdd(node *root,int &sum) {
if(!root)
return;
RevInorderAdd(root->right,sum);
sum+=root->data;
root->data=sum;
RevInorderAdd(root->left,sum);
}
void AddGreater(node *root) {
int sum=0;
RevInorderAdd(root,sum);
}
int main() {
/* Let us create following BST
10
/ \
5 20
/ \ / \
1 7 15 25 */
node *root = NULL;
root = Insert(root, 10);
Insert(root, 20);
Insert(root, 25);
Insert(root, 15);
Insert(root, 5);
Insert(root, 7);
Insert(root, 1);
Inorder(root);
cout<<endl;
AddGreater(root);
Inorder(root);
cout<<endl;
return 0;
}