public BinaryTree findAndReplaceSkill()
    {
        BinaryTree TreeNode = null;

        //decide what tree to look in based on skill type of the selected skill
        switch (selectedSkill.skillType)
        {
        case (SkillTreeNode.SkillType.Q):
        {
            //find the Binary tree node with the selected skill in it
            TreeNode = SavedData.GetComponent <SkillSavedData>().QTree.findSkillElement(selectedSkill.skillObject.name);
            //remove old skill
            if (SavedData.GetComponent <PlayerSavedData>().QSkill != null)
            {
                Destroy(Player.transform.FindChild(SavedData.GetComponent <PlayerSavedData>().QSkill.name + "(Clone)").gameObject);
            }
            //update all texts needed
            equipedQText.text = Qstring + selectedSkill.GetComponentInChildren <Text>().text;
            //save data
            SavedData.GetComponent <PlayerSavedData>().QSkill = selectedSkill.skillObject;
            break;
        }

        case (SkillTreeNode.SkillType.E):
        {
            //TODO add the same case as Q just for all the other cases.
            break;
        }

        case (SkillTreeNode.SkillType.MS):
        {
            break;
        }

        case (SkillTreeNode.SkillType.MW):
        {
            break;
        }

        case (SkillTreeNode.SkillType.RS):
        {
            break;
        }

        case (SkillTreeNode.SkillType.RW):
        {
            break;
        }

        default:
        {
            break;
        }
        }
        //finally apply the skills to the player.
        SavedData.SendMessage("ApplySkillsToPlayer", Player);
        return(TreeNode);
    }
 //this is called when we click on a skill node
 void SkillSelected(SkillTreeNode skill)
 {
     //Apply the skill to the player
     selectedSkill          = skill;
     selectedSkillText.text = "Selected Ability:\n" + selectedSkill.GetComponentInChildren <Text>().text;
     if (selectedSkill.bought)
     {
         findAndReplaceSkill();
     }
 }