编程练习——二叉树(BinaryTree)
2008-08-19 11:36
330 查看
先写一个树节点类。使用Temple也可以,不使用的话,使用特定类型,用法比较局限。不过本着“今天尽量不要做出今天不必要的决定”极限编程法制。做一个特殊类型的BinaryTree,也未尝不可。
这里的TreeNode只有数据域。
template<class T>
class TreeNode
{
private:
T data;
TreeNode<T> * left;
TreeNode<T> * right;
public:
TreeNode(T& data)
{
this->data = data;
this->left = NULL;
this->right = NULL;
}
TreeNode(T& data,TreeNode<T>* left, TreeNode<T>* right)
{
this->data = data;
this->left = left;
this->right = right;
}
~TreeNode()
{
this->left = NULL;
this->right = NULL;
cout << "node ("<<this->data<<") destory!"<<endl;
// to do
}
T getData()
{
return data;
}
void setData(T& data)
{
this->data = data;
}
TreeNode<T> * getLeft()
{
return left;
}
void setLeft(TreeNode<T> * left)
{
this->left = left;
}
TreeNode<T> * getRight()
{
return right;
}
void setRight(TreeNode<T>* right)
{
this->right = right;
}
};
下面是BinaryTree的实现。一般来说,一个BinaryTree最重要的函数就是构造和析构。基本的函数是遍历。
下面的类只实现了中序遍历,和树形打印。析构删除节点使用的是后序删除法。
template<class T>
class BinaryTree
{
protected:
TreeNode<T>* head;
void clearSubTree(TreeNode<T>* node)
{
if(node != NULL)
{
clearSubTree(node->getLeft());
clearSubTree(node->getRight());
delete node;
}
}
void printTree(TreeNode<T>* subTree, int count)
{
if(subTree!=NULL)
{
printTree(subTree->getRight(), count+1);
for(int i = 0; i < count; i++)
{
cout << " ";
}
cout <<subTree->getData()<<endl;
printTree(subTree->getLeft(),count+1);
}
}
void printInMidOrder(TreeNode<T>* subTree)
{
if(subTree!=NULL)
{
printInMidOrder(subTree->getLeft());
cout <<subTree->getData()<<endl;
printInMidOrder(subTree->getRight());
}
}
public:
BinaryTree(T& data)
{
head = new TreeNode<T>(data);
}
BinaryTree(TreeNode<T>* head)
{
this->head = head;
}
~BinaryTree()
{
clearSubTree(head);
}
void printTree()
{
printTree(this->head,0);
}
void printInMidOrder()
{
printInMidOrder(this->head);
}
};
如果BinaryTree中还有插入删除操作就好了。但是如何插入,如何删除必须按照一定的规则进行。所以就有后面的二叉查找树、AVLTree、SplayTree、RedBlackTree等各种类型的二叉树。
这里的TreeNode只有数据域。
template<class T>
class TreeNode
{
private:
T data;
TreeNode<T> * left;
TreeNode<T> * right;
public:
TreeNode(T& data)
{
this->data = data;
this->left = NULL;
this->right = NULL;
}
TreeNode(T& data,TreeNode<T>* left, TreeNode<T>* right)
{
this->data = data;
this->left = left;
this->right = right;
}
~TreeNode()
{
this->left = NULL;
this->right = NULL;
cout << "node ("<<this->data<<") destory!"<<endl;
// to do
}
T getData()
{
return data;
}
void setData(T& data)
{
this->data = data;
}
TreeNode<T> * getLeft()
{
return left;
}
void setLeft(TreeNode<T> * left)
{
this->left = left;
}
TreeNode<T> * getRight()
{
return right;
}
void setRight(TreeNode<T>* right)
{
this->right = right;
}
};
下面是BinaryTree的实现。一般来说,一个BinaryTree最重要的函数就是构造和析构。基本的函数是遍历。
下面的类只实现了中序遍历,和树形打印。析构删除节点使用的是后序删除法。
template<class T>
class BinaryTree
{
protected:
TreeNode<T>* head;
void clearSubTree(TreeNode<T>* node)
{
if(node != NULL)
{
clearSubTree(node->getLeft());
clearSubTree(node->getRight());
delete node;
}
}
void printTree(TreeNode<T>* subTree, int count)
{
if(subTree!=NULL)
{
printTree(subTree->getRight(), count+1);
for(int i = 0; i < count; i++)
{
cout << " ";
}
cout <<subTree->getData()<<endl;
printTree(subTree->getLeft(),count+1);
}
}
void printInMidOrder(TreeNode<T>* subTree)
{
if(subTree!=NULL)
{
printInMidOrder(subTree->getLeft());
cout <<subTree->getData()<<endl;
printInMidOrder(subTree->getRight());
}
}
public:
BinaryTree(T& data)
{
head = new TreeNode<T>(data);
}
BinaryTree(TreeNode<T>* head)
{
this->head = head;
}
~BinaryTree()
{
clearSubTree(head);
}
void printTree()
{
printTree(this->head,0);
}
void printInMidOrder()
{
printInMidOrder(this->head);
}
};
如果BinaryTree中还有插入删除操作就好了。但是如何插入,如何删除必须按照一定的规则进行。所以就有后面的二叉查找树、AVLTree、SplayTree、RedBlackTree等各种类型的二叉树。
相关文章推荐
- LeetCode练习-求二叉树的深度-Maximu Depth of Binary Tree
- 二叉树的最长路径和(Binary Tree Maximum Path Sum)
- leetcode 637. Average of Levels in Binary Tree 二叉树每层平均值+广度优先遍历BFS
- 【遍历二叉树】02二叉树的中序遍历【Binary Tree Inorder Traversal】
- 【遍历二叉树】06二叉树曲折(Z字形)层次遍历II【Binary Tree Zigzag Level Order Traversal】
- 【构建二叉树】01根据前序和中序序列构造二叉树【Construct Binary Tree from Preorder and Inorder Traversal】
- 5.1.3—二叉树的遍历—Binary Tree Postorder Traversal
- Leetcode在线编程 binary-tree-inorder-traversal
- 5.1.4—二叉树的遍历—Binary Tree Level Order Traversal
- 5.1.10—二叉树的遍历—Balanced Binary Tree
- 【LeetCode】Binary Tree Preorder Traversal 二叉树的前序遍历(3种方法)- Easy+
- 二叉树(Binary Tree)
- 二叉树递归问题 leetcode 572. Subtree of Another Tree & leetcode 110. Balanced Binary Tree
- [LeetCode] 236. Lowest Common Ancestor of a Binary Tree 二叉树的最近公共祖先
- Leetcode Construct Binary Tree from Preorder and Inorder Traversal 前序中序遍历重组二叉树
- Leetcode Construct Binary Tree from Inorder and Postorder Traversal 中序后序遍历重组二叉树
- leetCode 111. Minimum Depth of Binary Tree 二叉树问题
- lintcode binary-tree-serialization 二叉树的序列化与反序列化
- [LeetCode] 297. Serialize and Deserialize Binary Tree 二叉树的序列化和反序列化
- 【算法总结】Binary Tree & Binary Search Tree 二叉树