剑指offer 23----二叉树的前序、中序、后序、层序遍历

来源:互联网 发布:怎样做淘宝生意 编辑:程序博客网 时间:2024/06/08 02:23

二叉树的前序、中序、后序、层序遍历

#include <iostream>#include <Windows.h>#include <queue>using namespace std;template<class T>struct BinaryTreeNode      //构建二叉树的节点,及左右子树的指针{T _data;   //值BinaryTreeNode<T>* _left;   //左子树BinaryTreeNode<T>* _right;   //右子树BinaryTreeNode(const T& data)      //构造:_data(data), _left(NULL), _right(NULL){}};template<class T>class BinaryTree     //实现二叉树{typedef BinaryTreeNode<T> Node;   //节点protected:Node* _root;     //指向根节点的指针,里面保存根节点Node* CreateTree(T* a, size_t n, const T& invalid, size_t& index)    //递归{Node* root = NULL;if (index < n && a[index] != invalid)  //a不为非法值{//先序遍历建树root = new Node(a[index]);  //根root->_left = CreateTree(a, n, invalid, ++index);   //左root->_right = CreateTree(a, n, invalid, ++index);  //右}return root;}void _PreOrder(Node* root)     //前序实现   根 左 右{if (root == NULL){return;}cout << root->_data << " ";_PreOrder(root->_left);_PreOrder(root->_right);}void _InOrder(Node* root)    //中序实现    左  根  右{if (root == NULL){return;}_InOrder(root->_left);cout << root->_data << " ";_InOrder(root->_right);}void _PostOrder(Node* root)      //后序实现    左  右  根{if (root == NULL){return;}_PostOrder(root->_left);_PostOrder(root->_right);cout << root->_data << " ";}void _LevelOrder(Node* root)    //层序     利用队列的特性依次遍历{if (root == NULL){return;}queue<Node*> tty;tty.push(root);while (!tty.empty()){if (tty.front()->_left != NULL){tty.push(tty.front()->_left);}if (tty.front()->_right != NULL){tty.push(tty.front()->_right);}cout << tty.front()->_data << " ";tty.pop();}cout << endl;}public:BinaryTree():_root(NULL){}BinaryTree(T* a, size_t n, const T& invalid = T())    //构建二叉树,数组存放{size_t index = 0;_root = CreateTree(a, n, invalid, index);}void PreOrder()    //前序{_PreOrder(_root);}void InOrder()     //中序{_InOrder(_root);}void PostOrder()      //后序{_PostOrder(_root);}void LevelOrder()     //层序{_LevelOrder(_root);}};

#include "tree.h"void test(){int array[10] = { 1, 2, 3, '#', '#', 4, '#', '#', 5, 6 };BinaryTree<int> p(array, sizeof(array) / sizeof(array[0]), '#');//构建二叉树时是用前序建的树cout << "前序: " << "";p.PreOrder();cout << endl;cout << "中序: " << "";p.InOrder();cout << endl;cout << "后序: " << "";p.PostOrder();cout << endl;cout << "层序: " << "";p.LevelOrder();}int main(){test();system("pause");return 0;}



阅读全文
5 0