/*
简单二叉树
1
/ \
2 3
/ /
4 5
中序遍历:左子节点-----> 中间节点-----> 右子节点
前序遍历:中间节点-----> 左子节点-----> 右子节点
后序遍历: 左子节点-----> 右子节点-----> 中间节点
层序遍历:一层一层的从上往下/从左往右遍历
*/
#include <iostream>
#include <queue>
using namespace std;
template <typename T>
class TreeNode
{
public:
TreeNode(const T & d) :data(d)
{
leftChild = rightChild = nullptr;
}
T data;
TreeNode *leftChild;
TreeNode *rightChild;
};
template <typename T>
class BinaryTree
{
public:
~BinaryTree();
public:
void inOrder();
//中序遍历 左->中->右
void inOrder(TreeNode<T> * node);
void preOrder();
//前序遍历 中->左->右
void preOrder(TreeNode<T> * node);
void postOrder();
//后序遍历 左->右->中
void postOrder(TreeNode<T> * node);
void levelOrder();
//层序遍历
void visit(TreeNode<T> * node);
void findNode();
void findNode(TreeNode<T> * node, int value);
void clear(TreeNode<T> * node);
//计算思路:树的深度=左链的深度和右链深度的最大值 +1
int getTreeHight(TreeNode<T> * root);
TreeNode<T> * getRoot()
{
return root;
}
TreeNode<T> *root;
};
template<typename T>
BinaryTree<T>::~BinaryTree()
{
clear(root);
}
template<typename T>
void BinaryTree<T>::clear(TreeNode<T>*node)
{
if (node)
{
clear(node->leftChild);
clear(node->rightChild);
cout << " deleting " << node->data << " node " << "\n";
delete node;
}
}
template<typename T>
void BinaryTree<T>::findNode(TreeNode<T>*node, int value)
{
if (node==nullptr || node->data==value)
{
cout << node->data << " ";
}
if (node->leftChild != nullptr) findNode(node->leftChild, value);
if (node->rightChild != nullptr) findNode(node->rightChild, value);
}
template<typename T>
void BinaryTree<T>::findNode()
{
findNode(root);
}
template <typename T>
void BinaryTree< T>::visit(TreeNode<T>*node)
{
if (node)
cout << node->data << " ";
}
//二叉树的中序遍历(递归)
template <typename T>
void BinaryTree< T>::inOrder(TreeNode<T>*node)
{
if (node)
{
inOrder(node->leftChild);
visit(node);
inOrder(node->rightChild);
}
}
template <typename T>
void BinaryTree< T>::inOrder()
{
inOrder(root);
}
//二叉树的先序遍历(递归)
template <typename T>
void BinaryTree<T>::preOrder()
{
preOrder(root);
}
template <typename T>
void BinaryTree<T>::preOrder(TreeNode<T> *node)
{
if (node)
{
visit(node);
preOrder(node->leftChild);
preOrder(node->rightChild);
}
}
//二叉树的后序遍历(递归) 根节点最后访问
template <typename T>
void BinaryTree<T>::postOrder(TreeNode<T> *node)
{
if (node)
{
postOrder(node->leftChild);
postOrder(node->rightChild);
visit(node);
}
}
template <typename T>
void BinaryTree<T>::postOrder()
{
postOrder(root);
}
// 层级遍历
template <typename T>
void BinaryTree<T>::levelOrder()
{
queue<TreeNode<T>* > node_queue; //层序遍历,充分利用queue先进先出的特点
TreeNode<T>* p = root;
while (p)
{
visit(p);
if (p->leftChild) node_queue.push(p->leftChild); //先把左子节点放到队列
if (p->rightChild) node_queue.push(p->rightChild); //再把右子节点放到队列
if (node_queue.empty()) return; //到队列空的时候就返回
p = node_queue.front(); //当前指针指向先放进去的指针
node_queue.pop(); //将上边这个弹出队列
}
}
//获取树深
template <class T>
int BinaryTree<T>::getTreeHight(TreeNode<T>* root)
{
if (NULL == root)
return 0;
int i = getTreeHight(root->leftChild);
int j = getTreeHight(root->rightChild);
return i >= j ? i + 1 : j + 1;
}
/*
简单二叉树
1
/ \
2 3
/ /
4 5
中序遍历:左子节点-----> 中间节点-----> 右子节点
前序遍历:中间节点-----> 左子节点-----> 右子节点
后序遍历: 左子节点-----> 右子节点-----> 中间节点
层序遍历:一层一层的从上往下/从左往右遍历
*/
int main()
{
TreeNode<int> * node1 = new TreeNode<int>(1);
TreeNode<int> * node2 = new TreeNode<int>(2);
TreeNode<int> * node3 = new TreeNode<int>(3);
TreeNode<int> * node4 = new TreeNode<int>(4);
TreeNode<int> * node5 = new TreeNode<int>(5);
BinaryTree<int> tree;
tree.root = node1;
node1->leftChild = node2;
node1->rightChild = node3;
node2->leftChild = node4;
node3->leftChild = node5;
cout << "中序遍历: ";
tree.inOrder();
cout << endl;
cout << "前序遍历: ";
tree.preOrder();
cout << endl;
cout << "后序遍历: ";
tree.postOrder();
cout << endl;
cout << "层序遍历 ";
tree.levelOrder();
cout << endl;
cout << "树的深度 ";
cout << tree.getTreeHight(tree.getRoot()) << endl;
system("pause");
return 0;
}