// c++11
// 实现了前序 中序 后序遍历以及获取树的节点个数
#include <iostream>
using namespace std
template <typename T>
class BTreeNode
{
public:
BTreeNode()
{
m_pleft = nullptr;
m_pright = nullptr;
}
BTreeNode<T> * m_pleft;
BTreeNode<T> * m_pright;
T m_value;
};
template <typename T>
class BTree
{
protected:
BTreeNode<T> * m_root;
public:
BTree()
{
m_root = nullptr;
}
bool create()
{
cout << "前序遍历的方式构建:" << endl;
return (m_root = createImp()) ? true : false;
}
BTreeNode<T> * createImp()
{
BTreeNode<T> *p;
T ch;
cin >> ch;
/* cout << ch << endl;*/
if (ch == 0) //如果到了叶子节点,接下来的左、右子树分别赋值为0
{
p = nullptr;
}
else
{
p = new BTreeNode<T>;
p->m_value = ch;
p->m_pleft = createImp(); //递归创建左子树
p->m_pright = createImp(); //递归创建右子树
}
return p;
}
bool empty()
{
return (m_root == nullptr) ? true : false;
}
int nodeNum ()const
{
return nodeNumImp(m_root);
}
int depth() const
{
return depthImp(m_root);
}
void traverse(int flag) // flag 0 1 2 3
{
if (empty())
{
throw runtime_error("empty tree");
}
switch (flag)
{
case(0):
cout << "前序遍历结果:" << endl;
preOrderTraverseImp(m_root);
cout << endl;
break;
case(1):
cout << "中序遍历结果:" << endl;
inOrderTraverseImp(m_root);
cout << endl;
break;
case(2):
cout << "后序遍历结果:" << endl;
postOrderTraverseImp(m_root);
cout << endl;
break;
case(3):
cout << "层次遍历结果:" << endl;
levelOrderTraverseImp();
cout << endl;
break;
default:
cout << "Usage: 0 前序 1 中序 2 后序 3 层次" << endl;
break;
}
}
private:
void preOrderTraverseImp(BTreeNode<T> * root)
{
if (root)
{
cout << root->m_value << " ";
preOrderTraverseImp(root -> m_pleft);
preOrderTraverseImp(root-> m_pright);
}
}
void preOrderTraverseImp2(BTreeNode<T> * root)
{
// 非递归形式的遍历,利用一个栈,先放右节点,再放左节点
stack<BTreeNode<T> *> s;
s.push(m_root);
while (!s.empty())
{
BTreeNode<T> * temp = s.top();
cout << temp->m_value << " ";
s.pop();
if (temp->m_pright)
{
s.push(temp->m_pright);
}
if (temp->m_pleft)
{
s.push(temp->m_pleft);
}
}
}
void inOrderTraverseImp(BTreeNode<T> * root)
{
if (root)
{
inOrderTraverseImp(root->m_pleft);
cout << root->m_value << " ";
inOrderTraverseImp(root->m_pright);
}
}
void inOrderTraverseImp2(BTreeNode<T> * root)
{
// 非递归形式
stack<BTreeNode<T> *> s;
s.push(m_root);
BTreeNode<T> * temp = s.top();
while (temp && !s.empty())
{
if (temp->m_pleft)
{
s.push(temp->m_pleft);
temp = temp->m_pleft;
}
else
{
temp = s.top();
cout << temp->m_value << " ";
temp = temp->m_right;
}
}
while (temp)
{
while (temp->left)
{
s.push(temp->left);
temp = temp->m_pleft;
}
cout << temp->m_value << " ";
temp = s.top();
}
temp = s.top();
while (temp->m_pright)
{
s.push(temp->m_pright);
}
if (temp->m_pright)
{
s.push(temp->m_pright);
}
}
void postOrderTraverseImp(BTreeNode<T> * root)
{
if (root)
{
postOrderTraverseImp(root->m_pleft);
postOrderTraverseImp(root->m_pright);
cout << root->m_value << " ";
}
}
void levelOrderTraverseImp()
{
queue<BTreeNode<T>*> q;
q.push(m_root);
while (!q.empty())
{
int len = q.size();
//int depth = 0;
//cout << "第" << depth << "层" << endl;
while (len--)
{
BTreeNode<T>* temp = q.front();
cout << temp->m_value << " ";
q.pop();
if (temp->m_pleft)
q.push(temp->m_pleft);
if (temp->m_pright)
q.push(temp->m_pright);
}
}
}
int nodeNumImp(BTreeNode<T> * root) const
{
return (root == nullptr) ? 0 : ( 1 + nodeNumImp(root->m_pleft) + nodeNumImp(root->m_pright) );
}
int depthImp(BTreeNode<T> * root) const
{
if (root == NULL)
return 0;
return (depthImp(root->m_pleft) >depthImp(root->m_pright) ? \
depthImp(root->m_pleft) : depthImp(root->m_pright)) + 1 ;
}
};
int main()
{
BTree<int> tree;
tree.create() ? cout << "创建成功...\n" : cout << "创建失败...\n";
for (auto i = 0; i < 4; ++i)
{
tree.traverse(i);
}
cout << endl;
cout << tree.nodeNum() << endl;
cout << tree.depth() << endl;
retrun 0;
}
数据结构:二叉树
最新推荐文章于 2024-10-20 23:08:27 发布