二叉树遍历的递归算法
二叉树遍历
递归算法
- BinaryTree.h
// // Created by Administrator on 2021/10/25. // #ifndef TEST_BINARYTREE_H #define TEST_BINARYTREE_H #include <iostream> using namespace std; typedef char ElemType; typedef struct BiNode { ElemType data; BiNode *left; BiNode *right; BiNode(ElemType val) { data = val; left = nullptr; right = nullptr; } } BiNode, *BiTree; class BinaryTree { public: void Create(); int getSize(); int getHeight(); void preOrder(); void inOrder(); void postOrder(); void destroy(); private: BiTree create(); void preOrder(BiTree root); void inOrder(BiTree root); void postOrder(BiTree root); void destroy(BiTree root); int getHeight(BiTree root); void AddNode(ElemType key, int direction, BiTree root); BiTree m_root; int size; }; #endif //TEST_BINARYTREE_H
- BinaryTree.cpp
// // Created by Administrator on 2021/10/25. // #include "BinaryTree.h" void BinaryTree::Create() { size = 0; m_root = create(); } int BinaryTree::getSize() { return size; } int BinaryTree::getHeight() { return getHeight(m_root); } void BinaryTree::preOrder() { cout << "先序遍历:" << endl; preOrder(m_root); cout << endl; } void BinaryTree::inOrder() { cout << "中序遍历:" << endl; inOrder(m_root); cout << endl; } void BinaryTree::postOrder() { cout << "后序遍历:" << endl; postOrder(m_root); cout << endl; } void BinaryTree::destroy() { destroy(m_root); } BiTree BinaryTree::create() { BiTree current = nullptr; ElemType val; // 输入值 cin >> val; if (val == '#') { // 当前子树为空 return nullptr; } else { // 递归创建左右子树 size++; current = new BiNode(val); current->left = create(); current->right = create(); return current; } } void BinaryTree::preOrder(BiTree root) { if (root == nullptr) return; else { cout << root->data << " --> "; // 先打印根节点 preOrder(root->left); // 遍历左子树 preOrder(root->right); // 遍历右子树 } } void BinaryTree::inOrder(BiTree root) { if (root == nullptr) return; else { inOrder(root->left); cout << root->data << " --> "; inOrder(root->right); } } void BinaryTree::postOrder(BiTree root) { if (root == nullptr) return; else { postOrder(root->left); postOrder(root->right); cout << root->data << " --> "; } } void BinaryTree::destroy(BiTree root) { if (root) { destroy(root->left); destroy(root->right); // 释放节点 delete root; root = nullptr; size = 0; } } /** * * @param root * @return 递归得到树高 */ int BinaryTree::getHeight(BiTree root) { if (root == nullptr) return 0; int left_height = getHeight(root->left); int right_height = getHeight(root->right); return (left_height > right_height) ? (left_height + 1) : (right_height + 1); } /** * 前序遍历的方式创建 * @param key 值 * @param direction 0是从左子树插入,1是从右子树插入 * @param root 被插入的根节点 */ void BinaryTree::AddNode(const ElemType key, int direction, BiTree root) { if (direction == 0) { // 插入到左子树 if (root->left == nullptr) root->left = new BiNode(key); else AddNode(key, direction, root->left); } else if (direction == 1) { // 插入到右子树 if (root->right == nullptr) root->right = new BiNode(key); else AddNode(key, direction, root->right); } }
- main.cpp
#include <iostream> #include "BinaryTree.h" using namespace std; int main() { BinaryTree tree{}; cout << "按先序遍历方式创建树:" << endl; // ABCD##E##FG###HI#J##K## tree.Create(); cout << "树的高度为:" << tree.getHeight() << endl; cout << "树的节点为:" << tree.getSize() << endl; tree.preOrder(); tree.inOrder(); tree.postOrder(); tree.destroy(); return 0; }
- 截图
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/15472525.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步