使用 C++ 刪除帶有值 k 的葉子節點?


讓我們首先定義表示樹節點的結構,它包含資料及其左右節點子節點。如果這是要建立的第一個節點,則它是一個根節點,否則是一個子節點。

struct Node {
   int data;
   struct Node *leftChild, *rightChild;
};

接下來,我們建立我們的 newNode(int data) 函式,它獲取一個 int 值並將其分配給節點的資料成員。該函式返回指向所建立的結構 Node 的指標。此外,新建立節點的左右子節點都設定為 null。

struct Node* newNode(int data) {
   struct Node* newNode = new Node;
   newNode->data = data;
   newNode->leftChild = newNode->rightChild = NULL;
   return (newNode);
}

現在,我們建立我們的 deleteNode(Node* root, int k) 函式,它獲取根節點和要刪除的節點的資料值。如果給定的節點是父節點,那麼它還刪除其左右子節點。該函式在刪除給定節點後返回修改後的根節點。

Node* deleteLeafNode(Node* root, int k) {
   if (root == NULL)
      return nullptr;
   root->leftChild = deleteLeafNode(root->leftChild, k);
   root->rightChild = deleteLeafNode(root->rightChild, k);
   if (root->data == k && root->leftChild == NULL &&
      root->rightChild == NULL)
      return nullptr;
   return root;
}

最後,為了在刪除後顯示樹,我們有一個在中序函式中遍歷樹的函式 inorder(Node* root)。

void inorder(Node* root){
   if (root != NULL){
      inorder(root->leftChild);
      inorder(root->rightChild);
      cout << root->data << " ";
   }
}

示例

讓我們看看以下刪除具有值 k 的葉子節點的實現。

 線上演示

#include <iostream>
using namespace std;
struct Node {
   int data;
   struct Node *leftChild, *rightChild;
};
struct Node* newNode(int data){
   struct Node* newNode = new Node;
   newNode->data = data;
   newNode->leftChild = newNode->rightChild = NULL;
   return (newNode);
}
Node* deleteLeafNode(Node* root, int k){
   if (root == NULL)
      return nullptr;
   root->leftChild = deleteLeafNode(root->leftChild, k);
   root->rightChild = deleteLeafNode(root->rightChild, k);
   if (root->data == k && root->leftChild == NULL &&
   root->rightChild == NULL)
      return nullptr;
   return root;
}
void inorder(Node* root){
   if (root != NULL){
      inorder(root->leftChild);
      inorder(root->rightChild);
      cout << root->data << " ";
   }
}
int main(void){
   struct Node* root = newNode(6);
   root->leftChild = newNode(7);
   root->rightChild = newNode(7);
   root->leftChild->leftChild = newNode(5);
   root->leftChild->rightChild = newNode(3);
   root->rightChild->rightChild = newNode(7);
   deleteLeafNode(root, 7);
   cout << "Inorder traversal after deleting given leaf node: ";
   inorder(root);
   return 0;
}

輸出

以上程式碼將產生以下輸出 −

Inorder traversal after deleting given leaf node: 5 3 7 6

更新時間:2021 年 1 月 16 日

94 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告
© . All rights reserved.