文件结构 :
文件名字 | 用途 |
CmakeList.txt | cmake文件 |
how.md | 简述思路以及其他说明 |
main.cpp | 主测试程序 |
Tree.cpp | 核心实现文件 |
Tree.h | 核心头文件 |
Tree.cpp
#include "Tree.h"
BinaryTree ::BinaryTree(int element) {
rootNode = new TreeNode;
rootNode->leftChild = nullptr;
rootNode->rightChild = nullptr;
rootNode->data = element;
}
void BinaryTree::destroy(TreeNode * node) {
if (node != nullptr) {
destroy(node->leftChild);
destroy(node->rightChild);
cout << "remove number " << node->data << endl;
delete node;
node = nullptr;
}
}
BinaryTree::~BinaryTree() {
destroy(rootNode);
}
void BinaryTree::append(int element, char derection, TreeNode * parents) {
if (derection == 'r'){
if (parents->rightChild == nullptr){
parents->rightChild = new TreeNode{element, nullptr, nullptr};
} else{
Waring
}
}
elif (derection == 'l'){
if (parents->leftChild == nullptr){
parents->leftChild = new TreeNode {element, nullptr, nullptr};
} else{
Waring
}
} else{
P_ERROR
}
}
void BinaryTree::append(TreeNode *node, char derection, TreeNode *parents) {
if (derection == 'r'){
if (parents->rightChild == nullptr){
parents->rightChild = node;
} else{
Waring
}
}
elif (derection == 'l'){
if (parents->leftChild == nullptr){
parents->leftChild = node;
} else{
Waring
}
} else{
P_ERROR
}
}
int BinaryTree::getDepth(TreeNode *node) const {
if (node == nullptr ) return 0;
else{
return getDepth(node->leftChild) > getDepth(node->rightChild) ?
getDepth(node->leftChild)+1 : getDepth(node->rightChild)+1;
}
}
Tree.h
#include <iostream>
#include <cstdlib>
using namespace std;
#define ERROR cout << "代码有误!"<<endl;exit(EXIT_FAILURE);
#define Waring cout << "此处已经有子树!"<<endl;
#define P_ERROR cout << "参数必须是 字符 'l' 或者 'r'!\n";
#define elif else if
struct TreeNode {
int data;
TreeNode *leftChild;
TreeNode *rightChild;
};
class BinaryTree {
private:
void destroy(TreeNode * Node);
public:
// root node
TreeNode *rootNode;
// creation and initialization
explicit BinaryTree(int element) ;
~BinaryTree();
// append a new Node by direction, l -> left r->right
void append(TreeNode *node, char derection, TreeNode * parents);
// create a new node and append the new Node by direction, l -> left r->right
void append(int element, char derection, TreeNode * parents);
// get depth
int getDepth(TreeNode *node) const;
};
main.cpp
#include "Tree.h"
int main(){
// create a tree like this :
// attention : N means it is an empty Node;
/* 1
* 2 3
* N 8 5 1
* N N N 2 N N N 7
*
*/
BinaryTree aTree(1);
aTree.append(2, 'l', aTree.rootNode);
aTree.append(3, 'r', aTree.rootNode);
aTree.append(8, 'r', aTree.rootNode->leftChild);
aTree.append(5, 'l', aTree.rootNode->rightChild);
// This is going to throw an error--此处已经有子树!
aTree.append(15, 'l', aTree.rootNode->rightChild);
auto new_node1 = new TreeNode{7, nullptr, nullptr};
auto new_node2 = new TreeNode{1, nullptr, new_node1};
aTree.append(new_node2, 'r', aTree.rootNode->rightChild);
aTree.append(2, 'r', aTree.rootNode->leftChild->rightChild);
// check the tree's height == 4?
if (aTree.getDepth(aTree.rootNode) == 4){
cout << "Yes!Successfully!"<<endl;
} else{
Waring
}
return 0;
}
终端运行结果
此处已经有子树!
Yes!Successfully!
remove number 2
remove number 8
remove number 2
remove number 5
remove number 7
remove number 1
remove number 3
remove number 1
源代码 :