Implement insert and delete of Tri-nay tree

Source: Internet
Author: User
Problem

Implement insert and delete In a tri-nary tree. A tri-nary tree is much like a binary tree but with three child nodes for each parent instead of two -- with the left node being values less than the parent, the right node values greater than the parent, and the middle nodes values equal to the parent.

For example, suppose I added the following nodes to the tree in this order: 5, 4, 9, 5, 7, 2, 2. The resulting tree wocould look like this:

  1 /*   2  * Author: Min Li  3  * This code can implement insert and delete in a tri-nary tree.  4  */  5   6 #include<iostream>  7   8 using namespace std;  9  10  11 // Definition for Tree Node 12 struct TreeNode { 13 public: 14         int val; 15         TreeNode *left; 16         TreeNode *right; 17         TreeNode *middle; 18         TreeNode(int x) : val(x), left(NULL), right(NULL), middle(NULL) {} 19 }; 20  21  22 // Class: trinaryTree 23 class trinaryTree { 24 public: 25     TreeNode* insert(TreeNode *root, int value);        // Insert a node 26     TreeNode* deleteNode(TreeNode *root, int value);    // Delete a node 27     TreeNode* findSuccessor(TreeNode *root);            // Find a node‘s successor 28     bool test();                                        // Test my code 29 }; 30  31  32 // Method: Insert a node into tri-nary tree 33 // return the root of new tri-nary tree 34 TreeNode* trinaryTree:: insert(TreeNode *root, int value) { 35     TreeNode *Node = new TreeNode(value); 36     if(root==NULL)                    // tree is empty 37       root = Node; 38     else { 39       TreeNode *parent; 40       TreeNode *tmpNode = root; 41       // Find the parent of "Node" 42       while(tmpNode!=NULL) {  43         parent = tmpNode; 44         if(tmpNode->val < Node->val)        // Node is in the right subtree 45           tmpNode = tmpNode->right; 46         else if(tmpNode->val > Node->val)    // Node is in the left subtree 47           tmpNode = tmpNode->left; 48         else                                // Node is in the middle subtree 49           tmpNode = tmpNode->middle; 50       } 51       // Insert the Node under parent 52       if(Node->val == parent->val) 53         parent->middle = Node; 54       else if(Node->val > parent->val) 55         parent->right = Node; 56       else 57         parent->left = Node; 58     } 59     return root; 60 } 61  62 // Method: Delete a node from tri-nary tree 63 // Return the root of new tree 64 TreeNode* trinaryTree:: deleteNode(TreeNode *root, int value) { 65          66     if(root==NULL) 67       return NULL; 68     if(root->val == value) { 69         if(root->left==NULL && root->middle==NULL && root->right==NULL) { // Delete a leaf 70             delete root; 71             return NULL; 72         } 73         if(root->middle!=NULL) {            // Middle child is not empty  74             root->middle = deleteNode(root->middle,value); 75         } 76         else { 77             if(root->left==NULL) {            // Left child is empty, but right child is not 78                 TreeNode* rightChild = root->right; 79                 delete root; 80                 return rightChild; 81                  82             } 83             else if(root->right==NULL) {    // Right child is empty, but left child is not 84                 TreeNode* leftChild = root->left; 85                 delete root; 86                 return leftChild; 87             } 88             else {    // Both left and right child exists 89                 TreeNode *successor = findSuccessor(root->right); 90                 root->val = successor->val; 91                 root->right = deleteNode(root->right,successor->val); 92             } 93         } 94     } 95     else if(root->val > value)  // Recursive left subtree 96       root->left = deleteNode(root->left,value); 97     else                        // Recursive right subtree 98       root->right = deleteNode(root->right,value); 99 100     return root;101 }102 103 // Method: Find the successor104 TreeNode* trinaryTree:: findSuccessor(TreeNode *root) {105     if(root->left==NULL)106       return root;107     else108       return findSuccessor(root->left);109 }110 111 112 // Method: Test113 bool trinaryTree:: test() {114     trinaryTree test;115     TreeNode *root = NULL;116     TreeNode *node;117     118     // Test tree insert119     int val[] = {5,4,9,5,7,2,2};120     int i;121     for(i=0;i<sizeof(val)/sizeof(int);i++) {122         root = test.insert(root,val[i]);123 124     }125     126     // Test tree delete127     // Case1: delete a leaf128     test.deleteNode(root,5);129     // Case2: delete root130     test.deleteNode(root,5);131     // Case3: delete a node with only left child132     test.deleteNode(root,4);133     134     return true;135 136 137 }

 

Implement insert and delete of Tri-nay tree

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.