aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzedarider <ymherklotz@gmail.com>2016-03-13 22:41:56 +0000
committerzedarider <ymherklotz@gmail.com>2016-03-13 22:41:56 +0000
commit050fcedf124b15f4f94cadbed73d8d95c354d7b6 (patch)
tree12de0506a58c542352cedf8c91bc2ac98bd2d717
parentf52b1d4a370f1720995337a1eb3e01f9383af2e4 (diff)
downloadimperial_2015-050fcedf124b15f4f94cadbed73d8d95c354d7b6.tar.gz
imperial_2015-050fcedf124b15f4f94cadbed73d8d95c354d7b6.zip
Adding binary tree algorithms
l---------C++/.#BinaryTree.cpp1
-rwxr-xr-xC++/BinaryTreebin0 -> 12480 bytes
-rw-r--r--C++/BinaryTree.cpp119
-rw-r--r--C++/BinaryTrees.pdfbin0 -> 1385527 bytes
-rwxr-xr-xC++/recbin0 -> 9968 bytes
-rw-r--r--C++/rec.cpp24
6 files changed, 135 insertions, 9 deletions
diff --git a/C++/.#BinaryTree.cpp b/C++/.#BinaryTree.cpp
new file mode 120000
index 0000000..caeba0d
--- /dev/null
+++ b/C++/.#BinaryTree.cpp
@@ -0,0 +1 @@
+yannherklotz@Yann-Arch.1096:1457904846 \ No newline at end of file
diff --git a/C++/BinaryTree b/C++/BinaryTree
new file mode 100755
index 0000000..247641a
--- /dev/null
+++ b/C++/BinaryTree
Binary files differ
diff --git a/C++/BinaryTree.cpp b/C++/BinaryTree.cpp
index 68ebefa..b752365 100644
--- a/C++/BinaryTree.cpp
+++ b/C++/BinaryTree.cpp
@@ -20,7 +20,14 @@ void addElement(treeNode*&, tree_t&);
void deallocateTree(treeNode*&);
void printTree(treeNode*);
void deleteFromRoot(treeNode*&, tree_t&);
+void deleteRoot(treeNode*&);
+void deleteLeftMost(treeNode*&, tree_t&);
int treeHeight(treeNode*);
+int max(int&, int&);
+bool isBalanced(treeNode*);
+int abs(int&);
+void rotateRight(treeNode*&);
+void rotateLeft(treeNode*&);
int main() {
treeNode* firstTree = NULL;
@@ -35,9 +42,38 @@ int main() {
addElement(firstTree, newElement);
}
- cout << "printing tree: " << endl;
+ cout << endl << "printing tree: " << endl;
+
+ printTree(firstTree);
+
+ cout << endl << "head root node: " << firstTree->element << endl;
+ //cout << endl << "which item would you want to delete?" << endl;
+ //cin >> newElement;
+
+ //deleteFromRoot(firstTree, newElement);
+
+ //cout << endl << "printing tree again:" << endl;
+
+ //printTree(firstTree);
+
+ cout << endl << "Height of tree: " << treeHeight(firstTree) << endl;
+
+ cout << endl << "Balanced Tree: " << isBalanced(firstTree) << endl;
+
+ cout << endl << "Rotate right: " << endl;
+
+ rotateLeft(firstTree);
+
+ printTree(firstTree);
+
+ cout << endl << "Height of tree: " << treeHeight(firstTree) << endl;
+ cout << endl << "Balanced Tree: " << isBalanced(firstTree) << endl;
+
+ cout << endl << "new head root node: " << firstTree->element << endl;
deallocateTree(firstTree);
+
+ cout << endl << "successfully deallocated tree..." << endl;
return 0;
}
@@ -63,25 +99,90 @@ void deallocateTree(treeNode* &hdTree) {
void printTree(treeNode* hdTree) {
if(hdTree != NULL) {
printTree(hdTree->left);
- cout << hdTree->element;
+ cout << hdTree->element << endl;
printTree(hdTree->right);
}
}
void deleteFromRoot(treeNode* &hdTree, tree_t &el) {
- if(el < hdTree->element) {
- deleteFromRoot(hdTree->left, el);
- } else if(el > hdTree->element) {
- deleteFromRoot(hdTree->right, el);
+ if(hdTree != NULL) {
+ if(hdTree->element == el) {
+ deleteRoot(hdTree);
+ } else if(hdTree->element > el) {
+ deleteFromRoot(hdTree->left, el);
+ } else {
+ deleteFromRoot(hdTree->right, el);
+ }
+ }
+}
+
+void deleteRoot(treeNode* &hdTree) {
+ treeNode* tmpPointer;
+ tree_t leftMost;
+ if(hdTree->right == NULL) {
+ tmpPointer = hdTree->left;
+ delete hdTree;
+ hdTree = tmpPointer;
+ } else {
+ deleteLeftMost(hdTree, leftMost);
+ hdTree->element = leftMost;
+ }
+}
+
+void deleteLeftMost(treeNode* &hdTree, tree_t &leftMost) {
+ if(hdTree->left == NULL) {
+ leftMost = hdTree->element;
+ deleteRoot(hdTree);
} else {
- // Do something
+ deleteLeftMost(hdTree->left, leftMost);
}
}
int treeHeight(treeNode* hdTree) {
- // Do something
+ if(hdTree == NULL) {
+ return 0;
+ }
+ return 1 + max(treeHeight(hdTree->left), treeHeight(hdTree->right));
}
-bool elementInTree(treeNode* hdTree, tree_t &el) {
+int max(int &a, int &b) {
+ return (a >= b) ? a: b;
+}
+
+bool isBalanced(treeNode* hdTree) {
+ int lh, rh;
+ if(hdTree == NULL) {
+ return true;
+ }
+
+ lh = treeHeight(hdTree->left);
+ rh = treeHeight(hdTree->right);
+
+ int diff = lh - rh;
+
+ if(abs(diff) <= 1 && isBalanced(hdTree->left) && isBalanced(hdTree->right)) {
+ return true;
+ }
+ return false;
+}
+
+int abs(int &a) {
+ if(a > 0) {
+ return a;
+ }
+ return (-1)*a;
+}
+
+void rotateRight(treeNode* &hdTree) {
+ treeNode* tmpTree = hdTree;
+ hdTree = hdTree->left;
+ tmpTree->left = hdTree->right;
+ hdTree->right = tmpTree;
+}
+void rotateLeft(treeNode* &hdTree) {
+ treeNode* tmpTree = hdTree;
+ hdTree = hdTree->right;
+ tmpTree->right = hdTree->left;
+ hdTree->left = tmpTree;
}
diff --git a/C++/BinaryTrees.pdf b/C++/BinaryTrees.pdf
new file mode 100644
index 0000000..dfc5e11
--- /dev/null
+++ b/C++/BinaryTrees.pdf
Binary files differ
diff --git a/C++/rec b/C++/rec
new file mode 100755
index 0000000..d2ed520
--- /dev/null
+++ b/C++/rec
Binary files differ
diff --git a/C++/rec.cpp b/C++/rec.cpp
new file mode 100644
index 0000000..9ec892e
--- /dev/null
+++ b/C++/rec.cpp
@@ -0,0 +1,24 @@
+#include <iostream>
+
+using namespace std;
+
+void returnDigits(int&);
+
+int main(int argc, char** argv) {
+ int n;
+ cout << "input a number to seperate:" << endl;
+ cin >> n;
+ returnDigits(n);
+ return 0;
+}
+
+void returnDigits(int &n) {
+ if(n > 10) {
+ int d = n % 10;
+ n /= 10;
+ returnDigits(n);
+ cout << d << endl;
+ } else {
+ cout << n << endl;
+ }
+}