Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

เพิ่มค่าที่มากกว่าทั้งหมดให้กับทุกโหนดใน BST ที่กำหนดหรือไม่


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;
}