二叉树的遍历 无外乎广度和深度 其中深度又分为前中后序遍历三种情况 这三种遍历若只是递归方法 自然很是简单 但递归代码简单 若嵌套层次太深 会栈溢出
二叉树节点数据结构:
struct Binary_node { int val; Binary_node *left; Binary_node *right; Binary_node(int v = 0, Binary_node *le = nullptr, Binary_node *ri = nullptr) :val(v), left(le), right(ri) {} };
二叉树类:
class BinaryTree { public: struct Binary_node *root; BinaryTree(Binary_node *pnode = nullptr) : root(pnode){} ~BinaryTree(){} void pre_order_recur(Binary_node *root, std::vector<int> &res); void in_order_recur(Binary_node *root, std::vector<int> &res); void post_order_recur(Binary_node *root, std::vector<int> &res); std::vector<int> pre_order_iter(Binary_node *root); std::vector<int> in_order_iter(Binary_node *root); std::vector<int> post_order_iter(Binary_node *root); //广度遍历 std::vector<int> level_trave(Binary_node *root); };
前中后序遍历的递归方法 不多做说明 太简单:
void BinaryTree::pre_order_recur(Binary_node *root, std::vector<int> &res) { if (root) { res.push_back(root->val); pre_order_recur(root->left, res); pre_order_recur(root->right, res); } } void BinaryTree::in_order_recur(Binary_node *root, std::vector<int> &res) { if (root) { in_order_recur(root->left, res); res.push_back(root->val); in_order_recur(root->right, res); } } void BinaryTree::post_order_recur(Binary_node *root, std::vector<int> &res) { if (root) { post_order_recur(root->left, res); post_order_recur(root->right, res); res.push_back(root->val); } }