通过真值树解析布尔表达式,eg:A&B|C
第一步:求出一个表达式的truth tree
1.生成真值表
2.根据真值表生成真值树(合并短路产生相同的两个子树)
/**************************************** * File: truth_tree.h * *A&B|C truth_table 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 * * Complete Binary Tree * -1(root) / \ A: 0 1 / \ / \ B: 0 1 0 1 \ \ \ / \ C: 1 1 1 0 1 * * * After merge * * -1(root) / \ A: 0 1 / / \ B: -1 0 1 \ \ / C: 1 1 -1 * * * *****************************************/ #ifndef UTIL_TRUTH_TREE_H #define UTIL_TRUTH_TREE_H #include <memory> #include <vector> namespace util { struct TruthTreeNode { int8_t value; std::shared_ptr<TruthTreeNode> left; std::shared_ptr<TruthTreeNode> right; explicit TruthTreeNode(int8_t in_v):value(in_v),left(nullptr),right(nullptr){} TruthTreeNode(const TruthTreeNode&) = delete; TruthTreeNode(TruthTreeNode&&) = delete; TruthTreeNode& operator=(const TruthTreeNode&) = delete; TruthTreeNode& operator=(TruthTreeNode&&) = delete; }; using truth_table_t = std::vector<std::vector<bool>>; class TruthTree { public: //Constructors and destructor TruthTree():m_root(nullptr){} TruthTree(const TruthTree& tree) { m_root = copy_tree(tree.root()); } TruthTree& operator=(const TruthTree& tree) { if (this == &tree) return *this; m_root = copy_tree(tree.root()); return *this; } TruthTree(TruthTree&&) = delete; TruthTree& operator=(TruthTree&&) = delete; ~TruthTree() = default; public: //interface void initialize_tree(const truth_table_t& truth_table); const std::shared_ptr<TruthTreeNode>& root() const { return m_root; } bool empty() const { if (nullptr == m_root) return true; if (nullptr == m_root->left && nullptr == m_root->right) return true; return false; } private: //static member method static std::shared_ptr<TruthTreeNode> copy_tree(const std::shared_ptr<TruthTreeNode>& parent_node_ptr); static std::shared_ptr<TruthTreeNode> table_to_tree(const truth_table_t& truth_table); static std::shared_ptr<TruthTreeNode> try_add_new_child_node(bool element, std::shared_ptr<TruthTreeNode> parent_node_ptr); static std::shared_ptr<TruthTreeNode> add_new_child_node(bool element, std::shared_ptr<TruthTreeNode> parent_node_ptr); static bool compare_tree(const std::shared_ptr<TruthTreeNode> left, const std::shared_ptr<TruthTreeNode> right); static void merge_child_trees(std::shared_ptr<TruthTreeNode> parent_node_ptr); private: //member data std::shared_ptr<TruthTreeNode> m_root; }; } #endif //UTIL_TRUTH_TREE_HView Code